我們知道,在async函數(shù)內(nèi)部,代碼不會繼續(xù)執(zhí)行,直到等待的協(xié)程完成執(zhí)行:await coro()# orawait asyncio.gather(coro_1(), coro_2())# Code below will run AFTER the coroutines above finish running = desired effect在函數(shù)外部(或內(nèi)部),async可以將協(xié)程添加到事件循環(huán)中asyncio.create_task(coro()),返回一個Task 對象。在我的場景中,任務(wù)被添加到 >>> 現(xiàn)有的運(yùn)行循環(huán) <<<中,隨后的代碼將繼續(xù)執(zhí)行,而無需等待該任務(wù)/協(xié)程完成。當(dāng)然,可以在任務(wù)結(jié)束時執(zhí)行回調(diào)函數(shù)task_obj.add_done_callback(callback_func)。asyncio.create_task(coro())在 Jupyter Notebooks / Jupyter Lab 上特別有用,因?yàn)?Jupyter 在后臺運(yùn)行事件循環(huán)。調(diào)用asyncio.get_event_loop()將檢索 Jupyter 的事件循環(huán)。在 Jupyter Notebook 中,我們無法調(diào)用asyncio.run(coro())或者loop.run_until_complete()因?yàn)檠h(huán)已經(jīng)在運(yùn)行(除非我們在一個單獨(dú)的進(jìn)程中運(yùn)行異步代碼并在該進(jìn)程中創(chuàng)建一個新的事件循環(huán),但這不是我正在尋找的用例)。所以我的問題是我如何才能等待(從異步函數(shù)外部=不使用await關(guān)鍵字)異步任務(wù)(或任務(wù)組)在執(zhí)行后面的代碼之前完成并檢索結(jié)果?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貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個贊
如果沒有并發(fā)執(zhí)行,這在邏輯上是不可能的。等待異步函數(shù)之外的東西意味著阻塞當(dāng)前線程。但是,如果當(dāng)前線程被阻塞,則任務(wù)可能無法運(yùn)行。您實(shí)際上可以編寫這樣的代碼(例如,等待在任務(wù)結(jié)束時設(shè)置的 threading.Event 對象)。但是由于我給出的原因,程序會死機(jī)。
添加回答
舉報
0/150
提交
取消