日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Python?asyncio異步編程常見(jiàn)問(wèn)題小結(jié)_python

作者:永遠(yuǎn)是少年啊 ? 更新時(shí)間: 2023-03-16 編程語(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

欄目分類
最近更新