網站首頁 編程語言 正文
今天繼續給大家介紹Python相關知識,本文主要內容是Python asyncio異步編程常見問題。
一、asyncio編程簡單示例
首先,我們來看一段簡單的Python asyncio異步編程代碼,相關代碼如下所示:
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()協程函數生成的Task對象添加到task列表中,最終實現了這兩個函數異步執行。上述代碼執行結果如下所示:
二、asyncio編程常見問題
下面,我們想要簡單的修改一下上述代碼,我們把main()函數刪除,嘗試直接生成協程對象列表,結果如下所示:
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)
上述代碼執行結果如下所示:
三、報錯原因及解決方案
從上圖中可以看出,上述代碼執行報錯,錯誤提示為:RuntimeError:no running event loop。
其實,之所以出現上述報錯,直接原因在于當前沒有事件循環。當我們使用asyncio模塊來實現異步編程時,asyncio模塊的優點在于省略了我們創建事件循環的過程,但是這并不意味著asyncio異步編程不需要事件循環。事實上,在第一段代碼中,代碼:
asyncio.run(main())
在實際上創建了這個事件循環,但是asyncio模塊屏蔽了這一細節。而正是因為已經存在了事件循環,因此我們才可以執行命令:
done,pending=await asyncio.wait(task_list)
但是在上述代碼中,我們沒有創建事件循環,而是直接將該代碼放到主程序中執行,因此上述代碼會出現報錯。
針對上述代碼,我們可以簡單修改為以下內容:
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列表中存放的是協程對象,而不是Task對象,這樣,我們在執行asyncio.wait時會自動創建一個事件循環,并且把協程對象加入到事件循環中。因此上述代碼也就不會報錯了。執行結果如下所示:
原文鏈接:https://blog.csdn.net/weixin_40228200/article/details/128624839
相關推薦
- 2023-08-15 解決chrome升級后跨域跳轉cookie無法攜帶問題
- 2022-08-28 linux--network和NetManager沖突導致network[44649]:RTNETL
- 2022-06-13 golang下grpc框架的使用編寫示例_Golang
- 2022-09-26 React 函數式組件怎樣進行優化
- 2022-06-25 C#設計模式之適配器模式與裝飾器模式的實現_C#教程
- 2022-05-08 ASP.NET?MVC擴展HtmlHelper方法_實用技巧
- 2023-03-04 Golang錯誤處理方式異常與error_Golang
- 2023-01-29 switch多選擇結構、循環結構示例詳解_Swift
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支