您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python asyncio常用函數如何使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Python asyncio常用函數如何使用”文章能幫助大家解決問題。
需要使用 async def 語句
協程可以做哪些事:
1、等待一個future結果
2、等待另一個協程(產生一個結果或引發一個異常)
3、產生一個結果給正在等它的協程
4、引發一個異常給正在等它的協程
調用協程函數,協程不會開始運行,只是返回一個協程對象
要讓協程對象運行有兩種方式:
1、在另一個已經運行的協程中用await
等待它
2、通過ensure_future
函數計劃它的執行
只有某線程的loop運行了,協程才可能運行
下面的例子:
先拿到當前線程缺省的loop,然后將協程對象交給loop.run_until_complete,協程對象隨后會在loop里得到運行
loop = asyncio.get_event_loop() loop.run_until_complete(do_some_work(3))
run_until_complete
是一個阻塞調用,知道協程運行結束才返回
它的參數是一個future,但是我們傳給它的卻是協程對象,它在內部做了檢查,通過ensure_future函數把協程對象包裝成了future
我們可以這樣寫:
loop.run_until_complete(asyncio.ensure_future(do_some_work(3)))
多個協程在一個loop里運行,為了把多個協程交給loop,需要借助asyncio.gathre
函數
loop.run_until_complete(asyncio.gather(do_some_work(1), do_some_work(3)))
或者先將協程對象存到list中,這種比較常見
loop = asyncio.get_event_loop() #獲取當前線程loop coros_list = [] for i in range(2000): coros_list.append(main(i)) loop.run_until_complete(asyncio.gather(*coros_list))
gather 起聚合的作用,把多個 futures 包裝成單個 future,因為 loop.run_until_complete 只接受單個 future。
簡單來說,loop 只要不關閉,就還可以再運行。:
loop = asyncio.get_event_loop() #獲取當前線程loop loop.run_until_complete(do_some_work(loop, 1)) loop.run_until_complete(do_some_work(loop, 3)) loop.close()
但是如果關閉了,就不能再運行了:
loop = asyncio.get_event_loop() #獲取當前線程loop loop.run_until_complete(do_some_work(loop, 1)) loop.close() loop.run_until_complete(do_some_work(loop, 3)) # 此處異常
加入協程是一個IO的讀操作,等他讀完數據后,我們希望得到通知,以便下一步數據的處理。這個可以向future添加回調實現
def done_callback(futu): print('Done') futu = asyncio.ensure_future(do_some_work(3)) futu.add_done_callback(done_callback) loop.run_until_complete(futu)
事件循環會運行異步任務和回調,執行網絡IO操作,以及運行子進程
從asyncio event loop policy文檔,我們得知, event loop policy是一個進程全局對象,控制對該進程內所有event loop的管理。
進程的全局policy定義了該policy管控的context的含義,在每個context中管理分開獨立的event loop. 默認的policy定義的context就是當前的線程, 也就是說不同的線程是不同的context,因此有不同的event loop。
獲取事件循環
asyncio.get_running_loop() # 返回當前os線程中正在運行的事件循環 asyncio.get_event_loop() # 獲取當前事件循環 asyncio.set_event_loop(loop) # 獲取當前事件循環 asyncio.new_event_loop() # 創建并返回一個新的事件循環對象
asyncio.get_event_loop()
若:
當前線程為主線程
當前線程沒有啟動event loop
調用asyncio.get_event_loop()方法會生成一個新的默認event loop,并設置為當前線程的事件循環。
此時,get_event_loop()相當于:
loop = asyncio.new_event_loop() asyncio.set_event_loop(loop)
關于“Python asyncio常用函數如何使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。