亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何等待(不使用 await 關鍵字)asyncio 任務完成并檢索結果?

如何等待(不使用 await 關鍵字)asyncio 任務完成并檢索結果?

回首憶惘然 2022-11-01 16:59:20
我們知道,在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 對象)。但是由于我給出的原因,程序會死機。



查看完整回答
反對 回復 2022-11-01
  • 1 回答
  • 0 關注
  • 278 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號