如果使用的是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项。
关于如何有效地做到这一点的任何想法?
答案 0 :(得分:0)
可以使用asyncio.Event
来实现。创建一个事件,并将其传递给应通知的功能和应等待的功能。
等待方应await event.wait()
。通知方应呼叫event.set()
。这假定双方都使用异步而不是线程。如果通知程序在另一个线程中执行,则应改为调用loop.call_soon_threadsafe(event.set)
。