Python協程 三 Asyncio執行

2022-09-15 09:57:13 字數 2794 閱讀 7301

asyncio.run(coro, *, debug=false)

執行 coroutine

coro 並返回結果。

此函式執行傳入的協程,負責管理 asyncio 事件迴圈並完結非同步生成器。

當有其他 asyncio 事件迴圈在同一執行緒中執行時,此函式不能被呼叫。

如果 debug 為true,事件迴圈將以除錯模式執行。

此函式總是會建立乙個新的事件迴圈並在結束時關閉之。它應當被用作 asyncio 程式的主入口點,理想情況下應當只被呼叫一次。

示例:

async def

main():

await asyncio.sleep(1)

print('

hello')

asyncio.run(main())

asyncio.create_task(coro, *, name=none)

將 coro

協程 打包為乙個task排入日程準備執行。返回 task 物件。

如果name 不為none,它將使用task.set_name()來設為任務的名稱。

該任務會在get_running_loop()返回的迴圈中執行,如果當前執行緒沒有在執行的迴圈則會引發runtimeerror

此函式在 python 3.7 中被加入。在 python 3.7 之前,可以改用低層級的asyncio.ensure_future()函式。

在 3.8 版更改: 新增了name形參。

awaitable asyncio.gather(*aws, loop=none, return_exceptions=false)

併發 執行 aws 序列中的 可等待物件

。如果 aws 中的某個可等待物件為協程,它將自動作為乙個任務加入日程。

如果所有可等待物件都成功完成,結果將是乙個由所有返回值聚合而成的列表。結果值的順序與 aws 中可等待物件的順序一致。

如果 return_exceptions 為false(預設),所引發的首個異常會立即傳播給等待gather()的任務。aws 序列中的其他可等待物件不會被取消並將繼續執行。

如果 return_exceptions 為true,異常會和成功的結果一樣處理,並聚合至結果列表。

如果gather()被取消,所有被提交 (尚未完成) 的可等待物件也會 被取消。

如果 aws 序列中的任一 task 或 future 物件 被取消,它將被當作引發了cancellederror一樣處理 -- 在此情況下gather()呼叫不會被取消。這是為了防止乙個已提交的 task/future 被取消導致其他 tasks/future 也被取消。

deprecated since version 3.8, will be removed in version 3.10: loop 形參。

示例:

import

asyncio

async

deffactorial(name, number):

f = 1

for i in range(2, number + 1):

print(f"

task : compute factorial()...")

await asyncio.sleep(1)

f *=i

print(f"

task : factorial() = ")

async

defmain():

#schedule three calls *concurrently*:

await asyncio.gather(

factorial("a

", 2),

factorial("b

", 3),

factorial("c

", 4),

)asyncio.run(main())

#expected output:##

task a: compute factorial(2)...

#task b: compute factorial(2)...

#task c: compute factorial(2)...

#task a: factorial(2) = 2

#task b: compute factorial(3)...

#task c: compute factorial(3)...

#task b: factorial(3) = 6

#task c: compute factorial(4)...

#task c: factorial(4) = 24

註解 如果 return_exceptions 為 false,則在 gather() 被標記為已完成後取消它將不會取消任何已提交的可等待物件。 例如,在將乙個異常傳播給呼叫者之後,gather 可被標記為已完成,因此,在從 gather 捕獲乙個(由可等待物件所引發的)異常之後呼叫 gather.cancel() 將不會取消任何其他可等待物件。

在 3.7 版更改: 如果 gather 本身被取消,則無論 return_exceptions 取值為何,訊息都會被傳播。

python協程與非同步協程

在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...

python 執行緒程序協程(三)

1.在python3.4之前,協程是通過生成器 yield 實現的 def count down n while n 0 yield n n 1 if name main rest count down 5 print next rest print next rest print next res...

python協程使用 協程的案例

概念 使用者層面在乙個執行緒中進行多工切換的機制,比執行緒更加輕量級 實現併發量更大 協程的使用 使用第三方庫 gevent gevent 是乙個基於協程的 python 網路庫,在遇到 io 阻塞時,程式會自動進行切換,可以讓我們用同步的放肆寫非同步 io 協程的使用 from gevent im...