Python中的协程与Lua中的协程相比如何?

Lua中的coroutine支持由coroutine表中的函数提供,主要是createresumeyield 。 开发人员将这些协同程序描述为堆栈式,一流的和不对称的。

协程也可以在Python中使用,或者使用增强型生成器(并yield from生成),或者在3.5版本中添加asyncawait

Python中的协程与Lua中的协程相比如何? 他们也是堆叠式的,一流的和不对称的吗?

为什么Python需要如此多的结构( async defasync withasync for ,异步解析等),而Lua只能为它们提供三个内置函数?


简单的答案是他们是不同的语言。 是的,Python协程是堆叠的,一流的和不对称的。 看到这个答案:协程与持续vs发电机

从Lua文档:

有些人称之为不对称协程半协同程序(因为它们不是对称的,它们不是真正的共同的)。 然而,其他人使用相同的术语半协同程序来表示协程的有限实现,其中协程只有在其不在任何辅助功能内部时才暂停执行,也就是说,当它在其控制栈中没有挂起的调用时。 换句话说,只有这种半协程的主体才能屈服。 Python中的生成器就是半协程的这个含义的一个例子。

与对称和不对称协同程序之间的区别不同,协程和生成程序之间的区别(如Python中所示)是深层次的; 生成器的功能不足以实现我们可以用真正的协程编写的几个有趣的结构。 Lua提供了真正的不对称协程。 那些喜欢对称协程的人可以在Lua的不对称设施之上实现它们。 这是一件容易的事。 (基本上,每次转账都会有一个收益,然后是简历。)

另请参阅关于Python开发人员邮件列表的讨论:PEP 492:真正的目标是什么?


我刚刚看过lua ,其中包括sieve.lua现场演示。 它是使用协程的Erathostenes筛的实现。 我的直接想法是:这在Python中看起来更清洁:

#!/usr/bin/env python3

# sieve.py
# the sieve of Eratosthenes programmed with a generator functions
# typical usage: ./sieve.py 500 | column

import sys

# generate all the numbers from 2 to n
def gen(n):
    for i in range(2,n):
        yield i

# filter the numbers generated by `g', removing multiples of `p'
def filter(p, g):
    for n in g:
        if n%p !=0:
            yield n

N=int(sys.argv[1]) if len(sys.argv)>1 else 500 # from command line
x=gen(N)                     # generate primes up to N
while True:
    try:
        n = next(x)          # pick a number until done
    except StopIteration:
        break
    print(n)                 # must be a prime number
    x = filter(n, x)         # now remove its multiples

这与问题没有多大关系,但在使用Python 3.4.3的机器上,堆栈溢出发生在N>7500某处。 在Lua 5.2.3使用sieve.lua ,堆栈溢出在N>530时已经发生。

发生器对象(代表暂停的协程)可以像任何其他对象一样传递,内置的next()可以在任何地方应用,所以Python中的协程是一流的。 如果我错了,请纠正我。

链接地址: http://www.djcxy.com/p/53181.html

上一篇: How do coroutines in Python compare to those in Lua?

下一篇: Unity C# Yield WaitForSeconds within For Loop Only Works Once