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