Python?asyncio.run()?和?asyncio.gather()?的區(qū)別和聯(lián)系
一、一句話總結(jié)
| 函數(shù) | 作用 | 調(diào)用位置 | 類比理解 |
|---|---|---|---|
| asyncio.run() | 啟動(dòng)并運(yùn)行整個(gè)異步程序(事件循環(huán)) | ?? 程序入口(只能用一次) | “開發(fā)動(dòng)機(jī)” |
| asyncio.gather() | 在事件循環(huán)中并發(fā)執(zhí)行多個(gè)協(xié)程 | ?? 事件循環(huán)內(nèi)部 | “讓多輛車一起跑” |
二、核心區(qū)別詳解
1、asyncio.run(): 啟動(dòng)事件循環(huán)
? 功能
- 創(chuàng)建并啟動(dòng)一個(gè)新的事件循環(huán)(Event Loop)
- 執(zhí)行指定的頂層協(xié)程
- 在協(xié)程完成后,自動(dòng)關(guān)閉事件循環(huán)
?? 示例
import asyncio
async def main():
print("Hello asyncio")
asyncio.run(main())
運(yùn)行輸出:
Hello asyncio
?? 用法要點(diǎn)
asyncio.run()只能在普通函數(shù)或腳本入口使用- 在已經(jīng)運(yùn)行的事件循環(huán)中(如 Jupyter Notebook)不能再次調(diào)用
?? 錯(cuò)誤示例
async def inner():
asyncio.run(other()) # ? 不行!
會(huì)報(bào)錯(cuò):
RuntimeError: asyncio.run() cannot be called from a running event loop
2、asyncio.gather(): 并發(fā)執(zhí)行多個(gè)協(xié)程
? 功能
- 在已經(jīng)運(yùn)行的事件循環(huán)中,同時(shí)調(diào)度多個(gè)協(xié)程執(zhí)行
- 等待所有協(xié)程完成后,返回所有結(jié)果
?? 示例
import asyncio
async def task(name, delay):
await asyncio.sleep(delay)
print(f"{name} 完成")
return name
async def main():
results = await asyncio.gather(
task("任務(wù)A", 2),
task("任務(wù)B", 1),
)
print("全部完成:", results)
asyncio.run(main())
輸出:
任務(wù)B 完成
任務(wù)A 完成
全部完成: ['任務(wù)A', '任務(wù)B']
說明:
gather()同時(shí)啟動(dòng)多個(gè)任務(wù)- 自動(dòng)等待它們?nèi)繄?zhí)行完成
三、二者的關(guān)系(重要)
其實(shí),run() 和 gather() 經(jīng)常是配合使用的:
import asyncio
async def task(n):
await asyncio.sleep(1)
return n
async def main():
# gather 在 run 的內(nèi)部運(yùn)行
results = await asyncio.gather(task(1), task(2), task(3))
print(results)
# run 是最外層入口
asyncio.run(main())
執(zhí)行順序:
1.asyncio.run() 啟動(dòng)事件循環(huán)
2.main() 被執(zhí)行
3.asyncio.gather() 在循環(huán)中同時(shí)啟動(dòng)多個(gè)任務(wù)
4.所有任務(wù)完成后返回結(jié)果
5.事件循環(huán)關(guān)閉
四、形象的比喻
| 概念 | 類比 |
|---|---|
| asyncio.run() | 開動(dòng)車子,啟動(dòng)引擎 |
| async def main() | 定義駕駛計(jì)劃 |
| asyncio.gather() | 讓多個(gè)司機(jī)同時(shí)開不同的車去執(zhí)行任務(wù) |
五、總結(jié)對(duì)比表格
| 特性 | asyncio.run() | asyncio.gather() |
|---|---|---|
| 功能 | 啟動(dòng)事件循環(huán)并執(zhí)行主協(xié)程 | 并發(fā)運(yùn)行多個(gè)協(xié)程 |
| 作用范圍 | 程序最外層入口 | 程序內(nèi)部(事件循環(huán)中) |
| 是否創(chuàng)建事件循環(huán) | ? 是 | ? 否 |
| 是否關(guān)閉事件循環(huán) | ? 自動(dòng)關(guān)閉 | ? 不負(fù)責(zé) |
| 返回結(jié)果 | 主協(xié)程的返回值 | 所有協(xié)程的返回結(jié)果(list/tuple) |
| 可用次數(shù) | 通常只用一次 | 可多次調(diào)用 |
| 場(chǎng)景 | 啟動(dòng)異步程序 | 并發(fā)執(zhí)行任務(wù) |
六、小結(jié)
| 結(jié)論 | 說明 |
|---|---|
| asyncio.run() | 程序入口,用來啟動(dòng)整個(gè)異步環(huán)境 |
| asyncio.gather() | 運(yùn)行多個(gè)任務(wù),實(shí)現(xiàn)真正的并發(fā)執(zhí)行 |
| 二者關(guān)系 | run() 啟動(dòng)事件循環(huán),gather() 在循環(huán)中調(diào)度任務(wù) |
| 使用建議 | 永遠(yuǎn)只在最外層使用 run(),在內(nèi)部用 gather() |
到此這篇關(guān)于Python asyncio.run() 和 asyncio.gather() 的區(qū)別和聯(lián)系的文章就介紹到這了,更多相關(guān)Python asyncio.run() asyncio.gather()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python深度學(xué)習(xí)pytorch神經(jīng)網(wǎng)絡(luò)匯聚層理解
通常當(dāng)我們處理圖像時(shí),我們希望逐漸降低隱藏表示的空間分辨率,聚集信息,這樣隨著我們?cè)谏窠?jīng)網(wǎng)絡(luò)層疊的上升,每個(gè)神經(jīng)元對(duì)其敏感的感受野(輸入)就越大2021-10-10
python實(shí)戰(zhàn)教程之自動(dòng)掃雷
用python實(shí)現(xiàn)掃雷,非常有意思,這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)自動(dòng)掃雷的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
pytorch網(wǎng)絡(luò)模型構(gòu)建場(chǎng)景的問題介紹
這篇文章主要介紹了pytorch網(wǎng)絡(luò)模型構(gòu)建場(chǎng)景的注意點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03
Python基于回溯法子集樹模板解決最佳作業(yè)調(diào)度問題示例
這篇文章主要介紹了Python基于回溯法子集樹模板解決最佳作業(yè)調(diào)度問題,簡(jiǎn)單說明了作業(yè)調(diào)度問題并結(jié)合實(shí)例形式給出了Python使用回溯法子集樹模板實(shí)現(xiàn)最佳作業(yè)調(diào)度問題的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
Python模塊學(xué)習(xí)之subprocess詳解
subprocess是Python?2.4中新增的一個(gè)模塊,它允許你生成新的進(jìn)程,連接到它們的?input/output/error?管道,并獲取它們的返回(狀態(tài))碼,下面小編就來和大家聊聊它的具體使用吧2023-08-08
淺談Python中threading join和setDaemon用法及區(qū)別說明
這篇文章主要介紹了淺談Python中threading join和setDaemon用法及區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Pycharm激活方法及詳細(xì)教程(詳細(xì)且實(shí)用)
這篇文章主要介紹了Pycharm激活方法及詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-05-05
ActiveMQ:使用Python訪問ActiveMQ的方法
今天小編就為大家分享一篇ActiveMQ:使用Python訪問ActiveMQ的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01

