在古玩中等待事件的问题

时间:2019-06-06 21:37:43

标签: python python-asyncio 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()也会调用它的所有侍者,并且{ {1}}将在所有侍者都被调用之前不会继续,这意味着run()将在执行action()之前继续执行。这是我想要的输出:

print('Finished run')

我怎么了?有什么办法可以改变这种行为?我想对执行顺序有更多的控制。

谢谢

1 个答案:

答案 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