Python 3.x 从另一个上下文正确响应等待条件

Python 3.x 从另一个上下文正确响应等待条件,python-3.x,python-asyncio,pyzmq,uvloop,Python 3.x,Python Asyncio,Pyzmq,Uvloop,如果我使用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

如果我使用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),然后通知wait命令并传入这个rval项


关于如何在没有锁的情况下高效地执行此操作,您有什么想法吗?

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


等待端应
等待事件。等待()
。通知方应调用
事件.set()
。这假设双方都使用异步IO而不是线程。如果通知程序在不同的线程中执行,它应该调用
loop.call\u soon\u threadsafe(event.set)

如果我想从通知端传递一些东西到等待端,该怎么办。@Sam您可以在调用
set()
之前在事件对象上设置一个属性。或者,如果这感觉太麻烦,您可以创建一个同时包含事件和它传输的负载的对象,并传递它。