Проблема с ожиданием события в 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