Как мы знаем, внутри функции async
код не будет выполняться до тех пор, пока не завершится выполнение ожидаемой сопрограммы:
await coro()
# or
await asyncio.gather(coro_1(), coro_2())
# Code below will run AFTER the coroutines above finish running = desired effect
Вне (или внутри) функции async
, которую можно добавить сопрограммы к событию l oop с asyncio.create_task(coro())
, которое возвращает объект задачи .
В моем сценарии задачи добавляются к >>> существующему запущенному l oop <<< </strong>, и следующий код будет продолжать выполняться, не дожидаясь, пока эта задача / сопрограмма завершится sh. Конечно, можно выполнить функцию обратного вызова, когда задача заканчивается с task_obj.add_done_callback(callback_func)
.
asyncio.create_task(coro())
, особенно полезно в Jupyter Notebooks / Jupyter Lab, потому что Jupyter запускает событие l oop в фоновом режиме , Вызов asyncio.get_event_loop()
вернет событие Юпитера l oop. Внутри Jupyter Notebook мы не можем вызвать asyncio.run(coro())
или loop.run_until_complete()
, потому что l oop уже запущен (за исключением случаев, когда мы запускаем асин c код в отдельном процессе и создаем new событие l oop внутри этого процесса, но это не тот вариант использования, который я ищу).
Так что мой вопрос как мне ждать (снаружи asyn c function = без использования await
ключевое слово) для асинхронной задачи (или группы задач) до конца sh и получения результатов перед выполнением следующего кода?
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)