协程VS延续VS发电机协程VS延续VS发电机(Coroutine vs Continuation v

2019-05-12 14:32发布

是什么协程,并延续和发电机之间的区别?

Answer 1:

因为他们是最简单的情况下,我会用发电机启动,有看头。 作为@zvolkov提到的,他们可以重复调用,而不返回,但被称为将返回(收益率)的值,然后暂停其执行时的函数/对象。 当他们再次呼吁,他们将在那里他们最后中止执行开始,并再次做他们的事。

发电机基本上是一个降低(非对称)的协程。 协程和发电机之间的不同之处在于协同程序可以接受的参数,它已经开始调用后,而产生不了。

这是一个有点难以拿出,在那里你会使用协同程序一个简单的例子,但这里是我最好的尝试。 借此(由)Python代码,例如,

def my_coroutine_body(*args):
    while True:
        # Do some funky stuff
        *args = yield value_im_returning
        # Do some more funky stuff

my_coro = make_coroutine(my_coroutine_body)

x = 0
while True:
   # The coroutine does some funky stuff to x, and returns a new value.
   x = my_coro(x)
   print x

其中使用协同程序的一个例子是词法分析器和解析器。 如果没有语言协程或以某种方式模拟,文法和解析的代码需要被混合在一起,即使他们真的两个单独的担忧。 但是,使用协程,就可以分离出文法和解析的代码。

(我要刷满对称和非对称协程之间的差异可以肯定地说,他们是等价的,你可以从一个转换到另一个,和不对称协同程序 - 这是最像发电机 - 是的容易理解。我是一个概述如何可能在Python中实现不对称协程)。

延续实际上是相当简单的野兽。 所有他们,是代表在程序中,如果你调用它,将导致执行自动切换到函数表示点的另一个点的功能。 你每天都使用他们的非常有限的版本,甚至没有意识到这一点。 例外情况,例如,可以被看作是一种由内向外的延续。 我给你一个延续的一个基于Python的伪代码例子。

说的Python有一个函数调用callcc()这个函数把两个参数,第一个是功能,第二个是参数列表与调用它。 该函数唯一的限制是,它需要的最后一个参数将是一个功能(这将是我们目前的延续)。

def foo(x, y, cc):
   cc(max(x, y))

biggest = callcc(foo, [23, 42])
print biggest

会发生什么是callcc()会依次调用foo()与当前的延续( cc ),也就是说,在该程序中,以点参考callcc()被调用。 当foo()调用当前的延续,它本质上是一样的,告诉callcc()与您正在调用当前的延续价值回归,而当它这样做,它回滚栈当前的延续创建哪里即,当你叫callcc()

这一切的结果是,我们的假设Python的变种将打印'42'

我希望帮助,我敢肯定,我的解释可以在相当多的改善!



Answer 2:

协同程序是该轮流做他们的工作,然后停下来把控制权交给该组中的其他协程的几个步骤之一。

延续是一个“指向函数的指针”传递给某些程序,要执行的(“相续”)时的程序就完成了。

发生器(在.NET)是一个语言结构,可以吐出一个值,该方法的“暂停”执行,然后当要求的下一个值从同一点进行。



Answer 3:

在Python的新版本,您可以发送值发电机与generator.send()这使得Python生成有效的协同程序。

蟒蛇发电机和其他发电机之间的主要区别,说greenlet,是在Python,你yield value只能返回到调用者。 而在greenlet, target.switch(value)可以带你到一个特定的目标协程并产生值,其中target将继续运行。



文章来源: Coroutine vs Continuation vs Generator