Python的本地协程和send()

12 浏览
0 Comments

Python的本地协程和send()

生成器协程具有"send()"方法,允许调用者和被调用者之间进行双向通信,并从调用者处恢复一个被挂起的生成器协程。这就是将生成器转变为协程的功能所在。

虽然新的原生"async/await"协程对异步I/O提供了更好的支持,但我不知道如何使用它们来获得"send()"的等效功能。在"async"函数中使用"yield"被明确禁止,因此原生协程只能使用"return"语句一次返回。虽然"await"表达式将新的值带入协程中,但这些值来自被调用者,而不是调用者,并且每次都从开始处重新评估等待的调用,而不是从上次离开的地方开始。

是否有一种方法可以从离开的地方恢复返回的协程并可能发送新值?

如何使用原生协程模拟David Beazley在他的《关于协程和并发的奇特课程》中介绍的技术?

我心目中的一般代码模式类似于:

def myCoroutine():
  ...
  while True:
    ...
    ping = yield(pong)
    ...

在调用者中:

while True:
  ...
  buzz = myCoroutineGen.send(bizz)
  ...


编辑

我接受了Kevin的答案,但我注意到PEP中说

协程在内部基于生成器实现,因此它们共享实现。类似于生成器对象,协程具有throw()、send()和close()方法。

...

协程的throw()和send()方法用于将值推送到类似于Future的对象中,以及引发错误。

因此,原生协程确实有"send()"方法?在没有"yield"表达式的情况下,它是如何工作的以接收协程内部的值的?

0