是什么协程和延续和发电机之间的差异?

有帮助吗?

解决方案

我会用发电机启动,看到他们是最简单的情况。作为@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

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

(我要刷满对称和非对称协程之间的差异可以肯定地说,他们是等价的,你可以从一个转换到另一个,和不对称协同程序 - 这是最像generators- -are比较容易理解了。我是一个概述如何可能在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'

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

其他提示

协程是该轮流做他们的工作,然后暂停,得到控制到组中的其他协程几个过程之一。

继续是一个“指针指向一个函数”传递给一些过程,要执行(“相续”)时该过程被完成。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top