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