網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
今天繼續(xù)給大家介紹Python相關(guān)知識(shí),本文主要內(nèi)容是Python asyncio異步編程常見(jiàn)問(wèn)題。
一、asyncio編程簡(jiǎn)單示例
首先,我們來(lái)看一段簡(jiǎn)單的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對(duì)象添加到task列表中,最終實(shí)現(xiàn)了這兩個(gè)函數(shù)異步執(zhí)行。上述代碼執(zhí)行結(jié)果如下所示:
二、asyncio編程常見(jiàn)問(wèn)題
下面,我們想要簡(jiǎn)單的修改一下上述代碼,我們把main()函數(shù)刪除,嘗試直接生成協(xié)程對(duì)象列表,結(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)前沒(méi)有事件循環(huán)。當(dāng)我們使用asyncio模塊來(lái)實(shí)現(xiàn)異步編程時(shí),asyncio模塊的優(yōu)點(diǎn)在于省略了我們創(chuàng)建事件循環(huán)的過(guò)程,但是這并不意味著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)
但是在上述代碼中,我們沒(méi)有創(chuàng)建事件循環(huán),而是直接將該代碼放到主程序中執(zhí)行,因此上述代碼會(huì)出現(xiàn)報(bào)錯(cuò)。
針對(duì)上述代碼,我們可以簡(jiǎ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é)程對(duì)象,而不是Task對(duì)象,這樣,我們?cè)趫?zhí)行asyncio.wait時(shí)會(huì)自動(dòng)創(chuàng)建一個(gè)事件循環(huán),并且把協(xié)程對(duì)象加入到事件循環(huán)中。因此上述代碼也就不會(huì)報(bào)錯(cuò)了。執(zhí)行結(jié)果如下所示:
原文鏈接:https://blog.csdn.net/weixin_40228200/article/details/128624839
相關(guān)推薦
- 2024-03-24 spring boot 3 + spring cloud sleuth 無(wú)法注入Tracer問(wèn)題
- 2023-01-07 Python個(gè)人博客程序開(kāi)發(fā)實(shí)例用戶驗(yàn)證功能_python
- 2022-10-12 antd為Tree組件標(biāo)題附加操作按鈕功能_Redis
- 2023-01-05 Kotlin的空安全處理方式詳解_Android
- 2022-03-28 Python?NumPy實(shí)用函數(shù)筆記之a(chǎn)llclose_python
- 2022-08-29 Oracle中日期的使用方法實(shí)例_oracle
- 2022-11-25 Linux?Shell腳本多命令執(zhí)行邏輯的示例詳解_linux shell
- 2023-01-07 Flutter?Dart快速排序算法示例詳解_Dart
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支