Python asyncio異步編程常見問題小結(jié)
今天繼續(xù)給大家介紹Python相關(guān)知識,本文主要內(nèi)容是Python asyncio異步編程常見問題。
一、asyncio編程簡單示例
首先,我們來看一段簡單的Python asyncio異步編程代碼,相關(guān)代碼如下所示:
import asyncio async def fun(): print(1) await asyncio.sleep(2) print(2) return 3 async def main(): task_list=[ asyncio.create_task(fun()), asyncio.create_task(fun()) ] done,pending=await asyncio.wait(task_list) print(done) asyncio.run(main())
在上述代碼中,我們使用了Task列表,將兩個(gè)fun()協(xié)程函數(shù)生成的Task對象添加到task列表中,最終實(shí)現(xiàn)了這兩個(gè)函數(shù)異步執(zhí)行。上述代碼執(zhí)行結(jié)果如下所示:
二、asyncio編程常見問題
下面,我們想要簡單的修改一下上述代碼,我們把main()函數(shù)刪除,嘗試直接生成協(xié)程對象列表,結(jié)果如下所示:
import asyncio async def fun(): print(1) await asyncio.sleep(2) print(2) return 3 task_list=[ asyncio.create_task(fun()), asyncio.create_task(fun()) ] done,pending=asyncio.run(asyncio.wait(task_list)) print(done)
上述代碼執(zhí)行結(jié)果如下所示:
三、報(bào)錯(cuò)原因及解決方案
從上圖中可以看出,上述代碼執(zhí)行報(bào)錯(cuò),錯(cuò)誤提示為:RuntimeError:no running event loop。
其實(shí),之所以出現(xiàn)上述報(bào)錯(cuò),直接原因在于當(dāng)前沒有事件循環(huán)。當(dāng)我們使用asyncio模塊來實(shí)現(xiàn)異步編程時(shí),asyncio模塊的優(yōu)點(diǎn)在于省略了我們創(chuàng)建事件循環(huán)的過程,但是這并不意味著asyncio異步編程不需要事件循環(huán)。事實(shí)上,在第一段代碼中,代碼:
asyncio.run(main())
在實(shí)際上創(chuàng)建了這個(gè)事件循環(huán),但是asyncio模塊屏蔽了這一細(xì)節(jié)。而正是因?yàn)橐呀?jīng)存在了事件循環(huán),因此我們才可以執(zhí)行命令:
done,pending=await asyncio.wait(task_list)
但是在上述代碼中,我們沒有創(chuàng)建事件循環(huán),而是直接將該代碼放到主程序中執(zhí)行,因此上述代碼會出現(xiàn)報(bào)錯(cuò)。
針對上述代碼,我們可以簡單修改為以下內(nèi)容:
import asyncio async def fun(): print(1) await asyncio.sleep(2) print(2) return 3 task_list=[ fun(), fun() ] done,pending=asyncio.run(asyncio.wait(task_list)) print(done)
在上述代碼中,我們的Task列表中存放的是協(xié)程對象,而不是Task對象,這樣,我們在執(zhí)行asyncio.wait時(shí)會自動創(chuàng)建一個(gè)事件循環(huán),并且把協(xié)程對象加入到事件循環(huán)中。因此上述代碼也就不會報(bào)錯(cuò)了。執(zhí)行結(jié)果如下所示:
到此這篇關(guān)于Python asyncio異步編程常見問題小結(jié)的文章就介紹到這了,更多相關(guān)Python asyncio異步內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python使用asyncio實(shí)現(xiàn)異步操作的示例
- Python中asyncio的多種用法舉例(異步同步)
- Python使用asyncio處理異步編程的代碼示例
- Python使用asyncio包實(shí)現(xiàn)異步編程方式
- Python異步庫asyncio、aiohttp詳解
- python協(xié)程異步IO中asyncio的使用
- Python使用asyncio標(biāo)準(zhǔn)庫對異步IO的支持
- Python協(xié)程異步爬取數(shù)據(jù)(asyncio+aiohttp)實(shí)例
- Python使用asyncio異步時(shí)的常見問題總結(jié)
- Python asyncio異步編程簡單實(shí)現(xiàn)示例
- Python中asyncio庫實(shí)現(xiàn)異步編程的示例
相關(guān)文章
Flask框架使用DBUtils模塊連接數(shù)據(jù)庫操作示例
這篇文章主要介紹了Flask框架使用DBUtils模塊連接數(shù)據(jù)庫操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了flask框架使用DBUtils模塊連接數(shù)據(jù)庫的常見操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2018-07-07Python之torch.no_grad()函數(shù)使用和示例
這篇文章主要介紹了Python之torch.no_grad()函數(shù)使用和示例,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Django model 中設(shè)置聯(lián)合約束和聯(lián)合索引的方法
今天小編就為大家分享一篇Django model 中設(shè)置聯(lián)合約束和聯(lián)合索引的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08python pexpect ssh 遠(yuǎn)程登錄服務(wù)器的方法
今天小編就為大家分享一篇python pexpect ssh 遠(yuǎn)程登錄服務(wù)器的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02python 實(shí)現(xiàn)仿微信聊天時(shí)間格式化顯示的代碼
這篇文章主要介紹了python 實(shí)現(xiàn)仿微信聊天時(shí)間格式化顯示,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-04-04pytorch+sklearn實(shí)現(xiàn)數(shù)據(jù)加載的流程
這篇文章主要介紹了pytorch+sklearn實(shí)現(xiàn)數(shù)據(jù)加載,之前在訓(xùn)練網(wǎng)絡(luò)的時(shí)候加載數(shù)據(jù)都是稀里糊涂的放進(jìn)去的,也沒有理清楚里面的流程,今天整理一下,加深理解,也方便以后查閱,需要的朋友可以參考下2022-11-11Python?opencv進(jìn)行圓形識別(圓檢測)實(shí)例代碼
最近工作的項(xiàng)目上需要檢測圖像中是否有圓形,下面這篇文章主要給大家介紹了關(guān)于Python?opencv進(jìn)行圓形識別(圓檢測)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05Python數(shù)據(jù)庫編程之pymysql詳解
本文主要介紹了Python數(shù)據(jù)庫編程中pymysql,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05使用Python在Word中插入圖片并文字環(huán)繞的方法
在Word文檔中插入圖片能夠提供更直觀的信息,插入圖片時(shí),我們還可以調(diào)整圖片大小,以及設(shè)置合適的文字環(huán)繞方式,本文將提供兩種使用Python在Word文檔中插入圖片并設(shè)置文字環(huán)繞的方法,需要的朋友可以參考下2024-06-06