我正在嘗試在單個資料集上構建多個機器學習模型。所有模型的輸出隨后將用于進一步的步驟。我希望模型的訓練同時進行,以節省時間和體力勞動。
我對異步處理完全陌生,這已經在我下面的代碼中表現出來了。我得到錯誤:
sys:1 RuntimeWarning: coroutine 'level1models' 從未等待
不使用時,這似乎是一個相當普遍的問題await,但是無論我在哪里放置此命令,錯誤仍然存??在,并且我在網上找到的答案似乎沒有解決回傳值的函式。為了提供一個可重現的示例,我更改了我的代碼,同時保持與原始結構相同的結構。
from time import sleep
nrs_list = [1, 2, 3, 4, 5]
def subtract(n):
return n - 1
async def subtract_nrs(nrs):
# Train selected ML models
numbers = {nr: subtract(nr) for nr in nrs}
sleep(50)
# Loop to check if all models are trained
while True:
print([i for i in numbers.values()])
if [i for i in numbers.values()] != [None for _ in range(len(numbers))]:
break
sleep(5)
return numbers
r = subtract_nrs(nrs_list)
print(r)
<coroutine object subtract_nrs at 0x000002A413A4C4C0>
sys:1: RuntimeWarning: coroutine 'subtract_nrs' was never awaited
uj5u.com熱心網友回復:
任何時候你創建一個協程(當你呼叫 時在這里subtract_nrs)但不等待它,asyncio 將發出你收到的警告 [ 0 ]。避免這種情況的等待是通過等待協程,或者通過
await subtract_nrs(nrs_list)
或使用asyncio.gather[ 1 ],它本身必須等待
await asyncio.gather(subtract_nrs(nrs_list)
請注意,這里使用asyncio.gather. 只有當你需要同時等待多個協程時才會出現這種情況。
根據您的代碼,您似乎將其subtract_nrs用作程式的入口點。await不能在 之外使用async def,所以你需要另一種方式來等待它。為此,您通常需要使用asyncio.run[ 2 ]。這將處理創建、運行和關閉事件回圈以及等待您的協程。
asyncio.run(subtract_nrs(nrs_list))
現在我們已經涵蓋了所有這些,asyncio 實際上并不能幫助您實作同時執行的目標。asyncio 從不同時做事;它同時做事 [ 3 ]。當一個任務正在等待 I/O 完成時,asyncio 的事件回圈允許另一個任務執行。雖然您已宣告這是您實際代碼的簡化版本,但您提供的代碼不是 I/O 系結的;它受 CPU 限制。這種代碼不適用于 asyncio。要使用受 CPU 限制的代碼并實作更類似于同時執行的功能,您應該使用行程。不是異步的。最好的方法是使用ProcessPoolExecutorconcurrent.futures [ 4 ]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/442723.html
上一篇:如何使用.map正確創建promise.all函式?
下一篇:如何使用python-telegram-bot在dispatcher.run_async()中執行發送訊息任務?
