Python asyncio常用函數(shù)使用詳解
協(xié)程的定義
需要使用 async def 語句
協(xié)程可以做哪些事:
1、等待一個future結果
2、等待另一個協(xié)程(產(chǎn)生一個結果或引發(fā)一個異常)
3、產(chǎn)生一個結果給正在等它的協(xié)程
4、引發(fā)一個異常給正在等它的協(xié)程
協(xié)程的運行
調(diào)用協(xié)程函數(shù),協(xié)程不會開始運行,只是返回一個協(xié)程對象
要讓協(xié)程對象運行有兩種方式:
1、在另一個已經(jīng)運行的協(xié)程中用await
等待它
2、通過ensure_future
函數(shù)計劃它的執(zhí)行
只有某線程的loop運行了,協(xié)程才可能運行
下面的例子:
先拿到當前線程缺省的loop,然后將協(xié)程對象交給loop.run_until_complete,協(xié)程對象隨后會在loop里得到運行
loop = asyncio.get_event_loop() loop.run_until_complete(do_some_work(3))
run_until_complete
是一個阻塞調(diào)用,知道協(xié)程運行結束才返回
它的參數(shù)是一個future,但是我們傳給它的卻是協(xié)程對象,它在內(nèi)部做了檢查,通過ensure_future函數(shù)把協(xié)程對象包裝成了future
我們可以這樣寫:
loop.run_until_complete(asyncio.ensure_future(do_some_work(3)))
多個協(xié)程運行
多個協(xié)程在一個loop里運行,為了把多個協(xié)程交給loop,需要借助asyncio.gathre
函數(shù)
loop.run_until_complete(asyncio.gather(do_some_work(1), do_some_work(3)))
或者先將協(xié)程對象存到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.close()
簡單來說,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)) # 此處異常
回調(diào)
加入?yún)f(xié)程是一個IO的讀操作,等他讀完數(shù)據(jù)后,我們希望得到通知,以便下一步數(shù)據(jù)的處理。這個可以向future添加回調(diào)實現(xiàn)
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)
事件循環(huán)
事件循環(huán)會運行異步任務和回調(diào),執(zhí)行網(wǎng)絡IO操作,以及運行子進程
從asyncio event loop policy文檔,我們得知, event loop policy是一個進程全局對象,控制對該進程內(nèi)所有event loop的管理。
進程的全局policy定義了該policy管控的context的含義,在每個context中管理分開獨立的event loop. 默認的policy定義的context就是當前的線程, 也就是說不同的線程是不同的context,因此有不同的event loop。
獲取事件循環(huán)
asyncio.get_running_loop() # 返回當前os線程中正在運行的事件循環(huán) asyncio.get_event_loop() # 獲取當前事件循環(huán) asyncio.set_event_loop(loop) # 獲取當前事件循環(huán) asyncio.new_event_loop() # 創(chuàng)建并返回一個新的事件循環(huán)對象
asyncio.get_event_loop()
若:
- 當前線程為主線程
- 當前線程沒有啟動event loop
調(diào)用asyncio.get_event_loop()方法會生成一個新的默認event loop,并設置為當前線程的事件循環(huán)。
此時,get_event_loop()相當于:
loop = asyncio.new_event_loop() asyncio.set_event_loop(loop)
到此這篇關于Python asyncio常用函數(shù)使用詳解的文章就介紹到這了,更多相關Python asyncio內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
關于np.meshgrid函數(shù)中的indexing參數(shù)問題
Meshgrid函數(shù)在二維與三維空間中用于生成坐標網(wǎng)格,便于進行圖像處理和空間數(shù)據(jù)分析,二維情況下,默認使用笛卡爾坐標系,而三維meshgrid則涉及不同的坐標軸取法,在三維情況下,可能會出現(xiàn)坐標軸排列序混亂2024-09-09Python注釋、分支結構、循環(huán)結構、偽“選擇結構”用法實例分析
這篇文章主要介紹了Python注釋、分支結構、循環(huán)結構、偽“選擇結構”用法,結合實例形式分析了Python注釋、分支結構、循環(huán)結構、偽“選擇結構”相關功能、用法及操作注意事項,需要的朋友可以參考下2020-01-01pytest參數(shù)化:@pytest.mark.parametrize詳解
pytest.mark.parametrize裝飾器能夠對測試函數(shù)進行參數(shù)化處理,使得一個測試函數(shù)可以用多組數(shù)據(jù)執(zhí)行多次,這有助于檢查不同輸入下的期望輸出是否匹配,提高測試的效率和覆蓋率,裝飾器可以應用于函數(shù)、模塊或類,支持多個裝飾器組合使用,增強測試的靈活性和綜合性2024-10-10