我們知道,在async函數內部,代碼不會繼續執行,直到等待的協程完成執行:await coro()# orawait asyncio.gather(coro_1(), coro_2())# Code below will run AFTER the coroutines above finish running = desired effect在函數外部(或內部),async可以將協程添加到事件循環中asyncio.create_task(coro()),返回一個Task 對象。在我的場景中,任務被添加到 >>> 現有的運行循環 <<<中,隨后的代碼將繼續執行,而無需等待該任務/協程完成。當然,可以在任務結束時執行回調函數task_obj.add_done_callback(callback_func)。asyncio.create_task(coro())在 Jupyter Notebooks / Jupyter Lab 上特別有用,因為 Jupyter 在后臺運行事件循環。調用asyncio.get_event_loop()將檢索 Jupyter 的事件循環。在 Jupyter Notebook 中,我們無法調用asyncio.run(coro())或者loop.run_until_complete()因為循環已經在運行(除非我們在一個單獨的進程中運行異步代碼并在該進程中創建一個新的事件循環,但這不是我正在尋找的用例)。所以我的問題是我如何才能等待(從異步函數外部=不使用await關鍵字)異步任務(或任務組)在執行后面的代碼之前完成并檢索結果?tsk_obj = asyncio.create_task(coro()) # adds task to a (in my case) running event loop# QUESTION:# What can be done to await the result before executing the rest of the code below?print('Result is:', tsk_obj.result())# ^-- this of course will execute immediately = NOT the desired effect# (the coroutine is very likely still running on the event loop and the result is not ready)
1 回答

白板的微信
TA貢獻1883條經驗 獲得超3個贊
如果沒有并發執行,這在邏輯上是不可能的。等待異步函數之外的東西意味著阻塞當前線程。但是,如果當前線程被阻塞,則任務可能無法運行。您實際上可以編寫這樣的代碼(例如,等待在任務結束時設置的 threading.Event 對象)。但是由于我給出的原因,程序會死機。
添加回答
舉報
0/150
提交
取消