gpt4 book ai didi

python - 为什么Python协程不能递归调用?

转载 作者:行者123 更新时间:2023-11-28 22:50:27 25 4
gpt4 key购买 nike

我一直在使用 Python 协程而不是线程,并取得了一些成功。我突然想到我可能需要一个了解自身的协程,这样它就可以给自己发送一些东西。我发现这是不可能的(无论如何在 Python 3.3.3 中)。为了测试,我编写了以下代码:

def recursive_coroutine():
rc = (yield)
rc.send(rc)

reco = recursive_coroutine()
next(reco)
reco.send(reco)

这引发了一个异常:

Traceback (most recent call last):
File "rc.py", line 7, in <module>
reco.send(reco)
File "rc.py", line 3, in recursive_coroutine
rc.send(rc)
ValueError: generator already executing

虽然错误很明显,但感觉应该可以这样。我从来没有想出递归协程的有用、实际的应用程序,所以我不是在寻找特定问题的答案。除了可能实现困难之外,是否还有其他原因表明这是不可能的?

最佳答案

这是不可能的,因为要使 send 工作,协程必须等待输入。 yield 暂停协程,sendnext 取消暂停。如果生成器正在调用 send,它不能同时暂停并等待输入。

如果您可以发送到一个未暂停的协程,语义会变得非常奇怪。假设 rc.send(rc) 行有效。然后 send 将从它停止的地方继续执行协程,这是 send 调用...但是 send 没有返回值,因为我们没有'达到产量。

假设我们返回一些虚拟值并继续。然后协程将执行直到下一个 yield。到那时,会发生什么?执行是否倒带以便 send 可以返回产生的值? yield 是否丢弃该值?控制流到哪里去了?没有好的答案。

关于python - 为什么Python协程不能递归调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22649577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com