协程VS延续VS发电机
-
23-08-2019 - |
题
是什么协程和延续和发电机之间的差异?
解决方案
我会用发电机启动,看到他们是最简单的情况。作为@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
将继续运行。