正确响应来自另一个上下文的等待条件

Properly respond to await condition from another context

如果我正在使用 uvloop 或 asyncio,我正在尝试探索的功能之一是如果我执行一些操作然后 "await on a condition."

让我们看下面的例子:

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.

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

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

关于如何在没有锁的情况下高效地执行此操作的任何想法?

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

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