我正在使用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()
也会调用它的所有侍者,并且{ {1}}将在所有侍者都被调用之前不会继续,这意味着run()
将在执行action()
之前继续执行。这是我想要的输出:
print('Finished run')
我怎么了?有什么办法可以改变这种行为?我想对执行顺序有更多的控制。
谢谢
答案 0 :(得分: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