【问题标题】:Issue with waiting for an Event in curio在古玩中等待事件的问题
【发布时间】:2019-06-06 21:37:43
【问题描述】:

我正在使用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

我做错了什么?有没有办法改变这种行为?我希望对执行顺序有更多的控制权。

谢谢

【问题讨论】:

    标签: python python-asyncio curio


    【解决方案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())
    

    回复:

    Event set
    Performing action
    Event 2 set
    Finished run
    

    【讨论】:

    • 感谢您的回复,我现在明白了。我想我的用例很常见,这让我想 - 有没有比 curio.Event 更适合我的用例的现有机制?澄清一下 - 该机制应该允许一方等待事件(可以存在多个服务员),另一方设置事件等待其所有服务员完成处理,然后继续。
    • @imriqwe 恐怕我在这里不明白。我不能说我见过asyncio 的现有解决方案。
    猜你喜欢
    • 2022-01-13
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多