【发布时间】:2020-02-27 16:42:43
【问题描述】:
我已经使用 Python 多年,但只是逐渐研究了该语言更晦涩的功能,因为我的大部分代码都是用于数据处理的。基于yield 的生成器是我日常工具包的一部分,最近我读到了关于协程的文章。我找到了一个类似的例子:
def averager():
sum = 0.0
n = 0
while True:
value = yield
sum += value
n += 1
print(sum/n)
avg = averager()
next(avg) # prime the coroutine
avg.send(3)
avg.send(4)
avg.send(5)
打印发送给它的值的平均值。我认为这样的东西可能在数据处理管道中很有用,所以我决定把它放在我的脑海里。也就是说,直到我在Python documentation 中阅读以下通知:
对基于生成器的协程的支持已被弃用,并计划在 Python 3.10 中移除。
显然我想编写面向未来的代码,所以此时开始学习基于生成器的协程可能没用。那么,我的问题是:如何使用原生 (asyncio) 协程来实现这个示例?我很难理解原生协程语法。
在尝试寻找答案时,我发现了一个related question,其中有一个comment 和一个answer,它们基本上是在说“你不能用async 做,用yield 做而是基于协程”。但是如果这些都消失了,在 3.10+ 中是否有任何方法可以使用协程来做到这一点?
【问题讨论】:
-
@RomanPerekhrest:嗯,这是我的问题,不是吗?我会用“你做不到”作为答案,但这意味着用协程做这样的事情的能力将在没有任何替代的情况下离开 Python,这将是不方便的。当然,还有其他方法可以实现相同的目标,所以这不是什么大不了的事,但不幸的是。
标签: python coroutine python-asyncio