Может ли в python поток выполнения выполнить команду после `await` до завершения ожидания?

Рейтинг: 0Ответов: 1Опубликовано: 09.06.2023

Предположим, у меня есть следующий код:

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())
  1. Код функции control не будет запущен, пока не завершится ожидание функции run?
  2. Как в асинхронном контексте мне проверить, что функция suspend работает?
  3. Нужно использовать потоки, чтобы запустить run и control одновременно?
  4. Функция print в данном случае выведет сообщение в консоль?
  5. Функция print выведет сообщение до конца ожидания run?

Ответы

▲ 4Принят

Каждый await блокирует выполнение в текущей асинхронной функции, пока ожидаемый объект не будет завершен (но позволяет в это время выполняться другим асинхронным объектам).

Чтобы ждать несколько объектов параллельно, не нужны потоки, достаточно ожидать их одновременно, обернув в asyncio.wait (либо использовать asyncio.gather, если нужно собрать результаты в список).

В вашем случае будет что-то типа

run, suspend, cancel = MyTask()
await asyncio.wait(run, control(suspend))

Исходя из этого:

  1. Да
  2. Как минимум, нужно запустить функцию с await. Простой "вызов" асинхронной функции со скобками, но без await (и без передачи ее например в какие-то другие функции, которые ожидание выполнят) фактически не запустит функцию на выполнение.
  3. Используйте asyncio.wait, как я писал выше.
  4. Да, если run когда-либо завершится
  5. Нет, будет выполняться ожидание run