異步編程之asyncio簡單介紹

引言:

python因爲GIL(全局鎖)的存在,不能發揮多核的優點,其性能一直飽受詬病。然而在IO密集型的網絡編程裏,異步處理比同步處理能提高成百上千倍的效率,彌補了python性能方面的短板.python

asyncio是作什麼的?

  • 異步網絡操做
  • 併發
  • 協程

===>>  python3.0時代,標準庫裏的異步網絡模塊:select(很是底層)redis

===>>  python3.0時代,第三方異步網絡庫:Tornado編程

===>>  python3.4時代,asyncio:支持TCP,子進程.直接內置了對異步IO的支持。網絡

如今的asyncio,有了不少的模塊已經在支持:aiohttp,aiodns,aioredis等等.asyncio是python3.4版本引入到標準庫,python2x沒有加這個庫.併發

在學習asyncio以前,咱們先來理清楚同步/異步的概念:

  ★同步是指完成事務的邏輯,先執行第一個事務,若是阻塞了,會一直等待,直到這個事務完成,再執行第二個事務,順序執行。異步

  異步是和同步相對的,異步是指在處理調用這個事務的以後,不會等待這個事務的處理結果,直接處理第二個事務去了,經過狀態、通知、回調來通知調用者處理結果。async

官網對於asyncio的描述:

  • Asynchronous I/O(異步 I/O)。當代碼須要執行一個耗時的 I/O 操做的時候, 它只發出 I/O 的指令, 並不等待 I/O 的結果, 而後去執行其它的代碼, 以提升效率。
  • event loop(事件循環)。把基本的 I/O 操做轉換爲須要處理的事件, 經過事件循環作事件的監測和事件觸發等處理工做。
  • coroutines(協程)。線程是由操做系統控制切換的, 使用協程能夠收回控制權, 而且將異步編程同步化, 註冊到事件循環中的事件處理器就是協程對象, 它由事件循環來調用, 當程序阻塞等待讀取或者寫入數據的時候, 進行上下文的切換可讓效率最大化。
  • tasks(任務)。asyncio 模塊很是容易和方便的執行併發任務, 而且能夠實現建立、取消等管理任務。
  • future: 表明未來執行或沒有執行的任務的結果。它和task上沒有本質上的區別.
  • async/await 關鍵字:python3.5用於定義協程的關鍵字,async定義一個協程,await用於掛起阻塞的異步調用接口。

示例:

下面經過舉例來對比同步代碼和異步代碼編寫方面的差別,其次看下二者性能上的差距,咱們使用sleep(1)模擬耗時1秒的io操做。異步編程

 ·同步代碼:函數

import time

def hello():
    time.sleep(1)

def run():
    for i in range(5):
        hello()
        print('Hello World:%s' % time.time()) 
if __name__ == '__main__':
    run()

執行結果:(間隔約爲1s)oop

·異步代碼

import time
import asyncio

# 定義異步函數 經過async關鍵字定義一個協程(coroutine)
async def hello():
    asyncio.sleep(1)
    print('Hello World:%s' % time.time())

def run():
    for i in range(5):
        # 執行coroutine
        loop.run_until_complete(hello())

# 獲取EventLoop:
loop = asyncio.get_event_loop()
if __name__ =='__main__':
    run()

執行結果:

在上面帶中咱們經過async關鍵字定義一個協程(coroutine),固然協程不能直接運行,須要將協程加入到事件循環loop中,asyncio.get_event_loop:建立一個事件循環,而後使用run_until_complete將協程註冊到事件循環,並啓動事件循環.

相關文章
相關標籤/搜索