我注意到,當我使用 生成 asyncio 任務時create_task,它首先完成其余的邏輯,而不是啟動該任務。我不得不添加一個await asyncio.sleep(0)來啟動任務,這對我來說似乎有點老套和不干凈。
這是一些示例代碼:
async def make_rpc_calls(...some args...)
val_1, val_2 = await asyncio.gather(rpc_call_1(...), rpc_call_2(...))
return process(val_1, val_2)
def some_very_cpu_intensive_function(...some args...):
// Does a lot of computation, can take 20 seconds to run
task_1 = asyncio.get_running_loop().create_task(make_rpc_calls(...))
intensive_result = some_very_cpu_intensive_function(...)
await task_1
process(intensive_result, task_1.result())
每當我運行上述代碼時,它都會在some_very_cpu_intensive_function啟動昂貴的 RPC 之前運行該函式。我讓它作業的唯一方法是:
async def make_rpc_calls(...some args...)
val_1, val_2 = await asyncio.gather(rpc_call_1(...), rpc_call_2(...))
return process(val_1, val_2)
def some_very_cpu_intensive_function(...some args...):
// Does a lot of computation, can take 20 seconds to run
task_1 = asyncio.get_running_loop().create_task(make_rpc_calls(...))
await asyncio.sleep(0)
intensive_result = some_very_cpu_intensive_function(...)
await task_1
process(intensive_result, task_1.result())
這對我來說就像是一種黑客行為——我正在強制事件回圈進行背景關系切換,并且感覺我沒有正確使用 asyncio 框架。我應該用另一種方法來解決這個問題嗎?
uj5u.com熱心網友回復:
sleep() 總是暫停當前任務,允許其他任務運行。
將延遲設定為 0 可提供優化路徑以允許其他任務運行。這可以由長時間運行的函式使用,以避免在函式呼叫的整個持續時間內阻塞事件回圈。
來源:https ://docs.python.org/3/library/asyncio-task.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/412119.html
標籤:
上一篇:如何從資料框中獲取列的最后一個值
下一篇:查找具有多列的相似記錄
