Python的本地协程和send()
- 论坛
- Python的本地协程和send()
12 浏览
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"表达式的情况下,它是如何工作的以接收协程内部的值的?