python 協程

1、背景

     asyncio 庫最早由PyPI 提供,在基於Python3.3的環境時就已經能夠使用,而在2013年9月20日,正式加入Python3.4官方庫大家族,一直到Python3.5纔將許多臨時API定格下來,雖然計劃是這樣的,其實到Python3.6才定格。Python3.6爲其加入了async 和await 兩大關鍵字,能看出Python官方對其的重視程度。

import asyncio

asyncio.coroutine(func)
是一個裝飾器,定義一個協程,這個是python3.4中採用的方式,配合yield from使用,
在python3.5中已經使用async和await替代,從而更方便協程的使用
asyncio.sleep(delay, result=None, *, loop=None)
在協程中調用睡眠函數必須使用這個,而不能使用time中的sleep函數
asyncio.gather(*coros_or_futures, loop=None, return_exceptions=False)
將多個協程函數併發執行,但是其實也是有運行順序的(從左到右)的,返回一個future aggregating results,也需要註冊到時間循環中纔可以運行
asyncio.get_event_loop()
返回一個協程時間循環,如果有當前正在運行的事件循環,則返回當前正在運行的事件循環,如果沒有的話,則重新創建一個
asyncio.set_event_loop(loop)
將loop設置爲當前的事件循環,這個一般用來替換事件循環
asyncio.Lock()
創建協程鎖,loop用一個新的事件循環可以替換當前的事件循環
asyncio.Queue()
創建協程隊列,loop用一個新的事件循環可以替換當前的事件循環
asyncio.as_completed(fs, *, loop=None, timeout=None)
返回一個協程迭代器,與併發包concurrent中的行爲類似,result=await coroutine,loop用一個新的事件循環可以替換當前的事件循環

asyncio.wait(fs, *, loop=None, timeout=None, return_when=ALL_COMPLETED)
根據傳遞參數選擇什麼情況下返回已完成的協程,fs表示協程列表或者協程迭代器,loop用一個新的事件循環可以替換當前的事件循環
asyncio.FIRST_COMPLETED:第一個協程完成的話,就結束所有協程的執行
asyncio.FIRST_EXCEPTION:第一個協程產生異常的話,就結束所有協程的執行
asyncio.ALL_COMPLETED:等所有協程完成的話,再返回所有協程的執行狀態

asyncio.wait_for(fut, timeout, *, loop=None)
傳遞一個單一的future或一個coroutine,timeout屬於必傳參數,返回執行結果

asyncio.get_event_loop_policy()
與get_event_loop()的區別是:get_event_loop_policy直接創建一個事件循環,
get_event_loop如果已經有當前的事件循環就返回,沒有的話調用get_event_loop_policy創建

loop = asyncio.get_event_loop()
創建一個事件循環對象
r = loop.run_until_complete(future)
將一個協程添加到事件循環,直到運行結束,r.result()返回
loop.close()
關閉事件循環
loop.create_future()
創建一個future(協程)
loop.run_in_executor(executor, func, *args)
參數executor爲一個異步線程池,func爲執行的具體函數,args爲func的執行需要傳遞參數;
與tornado中的tornado.concurrent.run_on_executor有異曲同工之妙
loop.run_forever()
會永遠阻塞當前線程,直到有人停止了該 event loop 爲止
所以在同一個線程裏,兩個 event loop 無法同時 run,但這不能阻止您用兩個線程分別跑兩個 event loop

asyncio.ensure_future(coro_or_future, *, loop=None)
將一個異步函數註冊爲future對象,如果coro_or_future爲future對象,會直接返回
lock = asyncio.Event()
基於threading.Event來實現的,可以用用asyncio.Event做緩存等待,讓當前事件循環處於阻塞的狀態
Event中剛開始有個默認變量未False,是成爲阻塞狀態,調用lock.set()可以解鎖,也就是改變默認變量爲True,解除阻塞
asyncio.Future()
asyncio.Semaphore(value=1, *, loop=None)
用Semaphore做併發量控制,默認併發量爲1,限制函數訪問的最大併發量

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章