【发布时间】:2019-09-06 07:24:41
【问题描述】:
生成器与函数/子例程的不同之处在于,如果重复调用,它会从它们上次返回的行恢复,而不是从顶部重新开始。
虽然生成器总是将控制权交还给其调用例程,但apparently* 协程的区别仅在于控制它们将执行转移到何处的能力。
这是如何工作的,它与子程序调用有何不同(它也暂时暂停当前子程序的执行,同时控制立即执行的位置)?
* “所有这些使得生成器函数与协程非常相似;它们产生多次,它们有多个入口点,并且它们的执行可以暂停。唯一的区别 是生成器函数无法控制在它产生后应该继续执行的位置;控制权总是转移到生成器的调用者。" -- Python 手册,v2.5-3.7(自从引入了 yield-expressions 以来) .
此外,Conway 最初的 (1963) description 协程涉及它们使用对称语法相互传递控制,类似于对输入/输出函数的调用。 (类似地,Knuth The Art of Computer Programming 3rd Ed 给出了国际象棋游戏中每个玩家的协程示例,描述 “无法区分哪个是其他” 因为两个协程都像子程序一样调用另一个。)
【问题讨论】:
-
并非如此。生成器是从不查找
yield表达式返回值的协程。 -
究竟是什么让你认为协程能够控制它们将执行转移到哪里?
-
@martineau 有问题引用的来源;我已编辑以包含相关报价。
-
benjimin:感谢您的澄清。不幸的是,我仍然不太明白该怎么做。我认为这可能与协程能够
yield另一个协程(例如yield from another_coroutine())有关,但我不确定。很高兴看到文档正在讨论的示例。