Проблема с ожиданием события в Curio

Я использую curio реализовать механизм двух задач, которые общаются с помощью curio.Event объект. Первое задание (называется action()) запускается первым и awaits событие, которое будет установлено. Второе задание (называется setter()) запускается после первого и устанавливает событие.

Код следующий:

import curio

evt = curio.Event()


async def action():
    await evt.wait()
    print('Performing action')


async def setter():
    await evt.set()
    print('Event set')


async def run():
    task = await curio.spawn(action())
    await setter()
    print('Finished run')
    await task.wait()


curio.run(run())

Вывод следующий:

Event set
Finished run
Performing action

Что обозначает print('Performing action') выполняется ПОСЛЕ print('Finished run')и вот что я пытаюсь предотвратить - я ожидал, что вызов await evt.set() также вызовет всех своих официантов, и run() не будет продолжаться, пока не будут вызваны все официанты, что означает, что action() будет продолжаться ДО print('Finished run') выполнен. Это вывод, который я хотел бы получить:

Event set
Performing action
Finished run

Что я делаю не так? Есть ли способ изменить это поведение? Я хотел бы иметь больше контроля над порядком исполнения.

Спасибо

1 ответ

Решение

Настройка Event это способ сигнализировать о том, что что-то произошло: это, как вы уже заметили, не обеспечивает вызова официантов.

Если вы хотите сообщить о завершении выполнения после выполненного действия, вы должны сообщить об этом после ожидания действия:

async def run():
    task = await curio.spawn(action())
    await setter()
    await task.wait()  # await action been performed
    print('Finished run')  # and only after that reporting run() is done

Если вы хотите заблокировать выполнение run() пока что-то не произошло, вы можете сделать это с другим событием wait() которые должны быть set() когда это что-то случилось

import curio

evt = curio.Event()
evt2 = curio.Event()


async def action():
    await evt.wait()
    print('Performing action')
    await evt2.set()
    print('Event 2 set')


async def setter():
    await evt.set()
    print('Event set')


async def run():
    task = await curio.spawn(action())
    await setter()    
    await evt2.wait()
    print('Finished run')
    await task.wait()


curio.run(run())

Res:

Event set
Performing action
Event 2 set
Finished run
Другие вопросы по тегам