我在 python 中有一個慢函式,我想異步運行。這個慢函式基本上是一個很長的回圈,如下所示:
def slow(slowness):
print(f"Slow loop {slowness}")
for i in range(int(slowness * 1e8)):
i
print(f"Wait for loop {slowness} finished")
if __name__ == '__main__':
slow(1)
slow(0.5)
slow(0.1)
我正在嘗試使用以下代碼運行異步版本:
import asyncio
async def slow(slowness):
print(f"Slow loop {slowness}")
for i in range(int(slowness * 1e8)):
i
print(f"Wait for loop {slowness} finished")
async def main() -> None:
await asyncio.gather(
slow(1),
slow(0.5),
slow(0.1)
)
if __name__ == '__main__':
asyncio.run(main())
我希望慢速=0.1 的函式首先完成執行,但我看到一個看起來是同步的常規執行。我究竟做錯了什么?
我看到以下輸出:
Waiting for 1 seconds...
Wait for 1 seconds finished
Waiting for 0.5 seconds...
Wait for 0.5 seconds finished
Waiting for 0.1 seconds...
Wait for 0.1 seconds finished
我希望是這樣的:
Waiting for 1 seconds...
Waiting for 0.5 seconds...
Waiting for 0.1 seconds...
Wait for 0.1 seconds finished
Wait for 0.5 seconds finished
Wait for 1 seconds finished
uj5u.com熱心網友回復:
只有當當前正在執行的任務/協程通過等待將控制權交還給事件回圈時,才會執行其他任務/協程。slow不等待任何東西,因此永遠不會將控制權交還給事件回圈,因此其他任務在當前任務完成之前不會執行。
await asyncio.sleep(0) 將放棄控制但盡快執行
async def slow(slowness):
print(f"Slow loop {slowness}")
for i in range(int(slowness * 1e8)):
await asyncio.sleep(0)
print(f"Wait for loop {slowness} finished")
最好只睡正確的時間
async def slow(slowness):
print(f"Slow loop {slowness}")
await asyncio.sleep(slowness)
print(f"Wait for loop {slowness} finished")
uj5u.com熱心網友回復:
Asyncio 不是魔術。它不會突然賦予您的處理器三倍于當前的計算能力。我提供了這個簡單的清單來確定 asyncio 是否可以加速您的程式:
- 我的程式是否花費大量時間等待資源,例如網路、資料庫或(在我的情況下)一組儀器?
- 在它等待的程序中,它是否可以做一些有用的事情來代替?
如果這兩個問題的答案都是肯定的,那么考慮使用 asyncio 來提高性能。否則不行。
這不是 asyncio 的唯一用例,但它似乎是您感興趣的用例。 Python 人員將 asyncio 檔案放在“網路和行程間通信”而不是“并發執行”下是有原因的。
要加速數字運算型別的程式,您可能需要查看標準庫中的 multiprocessing 包,它支持真正的并行計算。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/401250.html
下一篇:用戶點擊按鈕后等待
