Может ли в python поток выполнения выполнить команду после `await` до завершения ожидания?
Предположим, у меня есть следующий код:
from my_module import MyTask
import asyncio
async def main():
async def controll(fsuspend):
await asyncio.sleep(2)
resume = await fsuspend()
await asyncio.sleep(2)
await resume()
run, suspend, cancel = MyTask()
await run
print('Test')
await control(suspend)
asyncio.run(main())
- Код функции
controlне будет запущен, пока не завершится ожидание функцииrun? - Как в асинхронном контексте мне проверить, что функция
suspendработает? - Нужно использовать потоки, чтобы запустить
runиcontrolодновременно? - Функция
printв данном случае выведет сообщение в консоль? - Функция
printвыведет сообщение до конца ожидания run?
Ответы (1 шт):
Автор решения: insolor
→ Ссылка
Каждый await блокирует выполнение в текущей асинхронной функции, пока ожидаемый объект не будет завершен (но позволяет в это время выполняться другим асинхронным объектам).
Чтобы ждать несколько объектов параллельно, не нужны потоки, достаточно ожидать их одновременно, обернув в asyncio.wait (либо использовать asyncio.gather, если нужно собрать результаты в список).
В вашем случае будет что-то типа
run, suspend, cancel = MyTask()
await asyncio.wait(run, control(suspend))
Исходя из этого:
- Да
- Как минимум, нужно запустить функцию с
await. Простой "вызов" асинхронной функции со скобками, но безawait(и без передачи ее например в какие-то другие функции, которые ожидание выполнят) фактически не запустит функцию на выполнение. - Используйте
asyncio.wait, как я писал выше. - Да, если
runкогда-либо завершится - Нет, будет выполняться ожидание
run