Python asyncio常用函數(shù)使用詳解
協(xié)程的定義
需要使用 async def 語(yǔ)句
協(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é)程不會(huì)開(kāi)始運(yùn)行,只是返回一個(gè)協(xié)程對(duì)象
要讓協(xié)程對(duì)象運(yùn)行有兩種方式:
1、在另一個(gè)已經(jīng)運(yùn)行的協(xié)程中用await等待它
2、通過(guò)ensure_future函數(shù)計(jì)劃它的執(zhí)行
只有某線程的loop運(yùn)行了,協(xié)程才可能運(yùn)行
下面的例子:
先拿到當(dāng)前線程缺省的loop,然后將協(xié)程對(duì)象交給loop.run_until_complete,協(xié)程對(duì)象隨后會(huì)在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é)程對(duì)象,它在內(nèi)部做了檢查,通過(guò)ensure_future函數(shù)把協(xié)程對(duì)象包裝成了future
我們可以這樣寫(xiě):
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é)程對(duì)象存到list中,這種比較常見(jiàn)
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()
簡(jiǎn)單來(lái)說(shuō),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)會(huì)運(yùn)行異步任務(wù)和回調(diào),執(zhí)行網(wǎng)絡(luò)IO操作,以及運(yùn)行子進(jìn)程
從asyncio event loop policy文檔,我們得知, event loop policy是一個(gè)進(jìn)程全局對(duì)象,控制對(duì)該進(jìn)程內(nèi)所有event loop的管理。
進(jìn)程的全局policy定義了該policy管控的context的含義,在每個(gè)context中管理分開(kāi)獨(dú)立的event loop. 默認(rèn)的policy定義的context就是當(dāng)前的線程, 也就是說(shuō)不同的線程是不同的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)對(duì)象
asyncio.get_event_loop()
若:
- 當(dāng)前線程為主線程
- 當(dāng)前線程沒(méi)有啟動(dòng)event loop
調(diào)用asyncio.get_event_loop()方法會(huì)生成一個(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python?Asyncio庫(kù)之a(chǎn)syncio.task常用函數(shù)詳解
- Python?Asyncio?庫(kù)之同步原語(yǔ)常用函數(shù)詳解
- Python asyncio異步編程常見(jiàn)問(wèn)題小結(jié)
- Python asyncio異步編程簡(jiǎn)單實(shí)現(xiàn)示例
- 簡(jiǎn)單有效上手Python3異步asyncio問(wèn)題
- Python使用asyncio包處理并發(fā)的實(shí)現(xiàn)代碼
- Python使用Asyncio進(jìn)行web編程方法詳解
- Python Asyncio調(diào)度原理詳情
相關(guān)文章
Python django框架 web端視頻加密的實(shí)例詳解
這篇文章主要介紹了Python django框架 web端視頻加密,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
VSCode配置python環(huán)境及中文問(wèn)題解決方法
這篇文章主要介紹了VSCode配置python環(huán)境及中文問(wèn)題,print打印中文亂碼如何解決這個(gè)問(wèn)題呢,本文給大家?guī)?lái)兩種方法幫助大家解決這個(gè)問(wèn)題,需要的朋友可以參考下2022-02-02
Python 實(shí)現(xiàn)將numpy中的nan和inf,nan替換成對(duì)應(yīng)的均值
這篇文章主要介紹了Python 實(shí)現(xiàn)將numpy中的nan和inf,nan替換成對(duì)應(yīng)的均值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
解決pymongo連接數(shù)據(jù)庫(kù)報(bào)錯(cuò)certificate verify failed:certific
這篇文章主要介紹了解決pymongo連接數(shù)據(jù)庫(kù)報(bào)錯(cuò)certificate verify failed:certificate has expired問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
python 兩個(gè)數(shù)據(jù)庫(kù)postgresql對(duì)比
這篇文章主要介紹了python 兩個(gè)數(shù)據(jù)庫(kù)postgresql對(duì)比,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Python 網(wǎng)絡(luò)編程說(shuō)明
socket 是網(wǎng)絡(luò)連接端點(diǎn)。2009-08-08
Python實(shí)現(xiàn)輸出某區(qū)間范圍內(nèi)全部素?cái)?shù)的方法
這篇文章主要介紹了Python實(shí)現(xiàn)輸出某區(qū)間范圍內(nèi)全部素?cái)?shù)的方法,涉及Python數(shù)值運(yùn)算、排序、判斷等相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
Python實(shí)現(xiàn)提取谷歌音樂(lè)搜索結(jié)果的方法
這篇文章主要介紹了Python實(shí)現(xiàn)提取谷歌音樂(lè)搜索結(jié)果的方法,涉及Python針對(duì)谷歌音樂(lè)相關(guān)信息的獲取技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07

