Как ожидать (без использования ключевого слова await) для выполнения асинхронной задачи и получения результата? - PullRequest
0 голосов
/ 01 мая 2020

Как мы знаем, внутри функции 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)

1 Ответ

1 голос
/ 03 мая 2020

Без одновременного выполнения это логически невозможно. Ожидание чего-либо вне функции asyn c означает блокирование текущего потока. Но если текущий поток заблокирован, задача не может быть запущена. Вы можете написать такой код (например, ожидая объекта threading.Event, который устанавливается в конце вашей задачи). Но программа заблокирована по той причине, которую я дал.

...