首页 > 解决方案 > 正确响应来自另一个上下文的等待条件

问题描述

如果正在使用 uvloop 或 asyncio,我试图探索的功能之一是如果我执行一些操作然后“等待某个条件”。

让我们看下面的例子:

do_something()
zmq.send(stuff,coroutine_context)
rr = await (condition)
return rr

然后其他一些过程会做一些工作。

那么这个进程的协程有:

rval = zmq.recv()
look at rval and get coroutine_context.
notify (condition) pass in rval.

现在我知道我可以使用条件变量之类的东西,但那些需要某种锁。我不关心多个人访问该协程,所以我不想“锁定”任何东西。我只是想用这个其他协程(zmq 协程)中的一些数据来通知()该上下文以返回到某个元素。

这里的关键是提取协程上下文(一些 id),然后通知 await 命令并传入这个 rval 项。

关于如何在没有锁的情况下有效地做到这一点的任何想法?

标签: python-3.xpython-asynciopyzmquvloop

解决方案


这可以使用asyncio.Event. 创建一个事件并将其传递给应该通知的函数和应该等待的函数。

等待的一方应该await event.wait()。通知方应致电event.set()。这假设双方都使用 asyncio 而不是线程。如果通知程序在不同的线程中执行,它应该调用loop.call_soon_threadsafe(event.set)


推荐阅读