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

问题描述:

支持lua中的协程程序由functions in the coroutine table提供,主要为create,resumeyield。开发人员将这些协程描述为stackful, first-class and asymmetricPython中的协程与Lua中的协程相比如何?

也可以使用Python中的协同程序,可以使用enhanced generators(和yield from)或在版本3.5中添加async and await

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

为什么Python的需要协同程序这么多的结构(async defasync withasync forasynchronous comprehensions,...),而Lua中能为他们提供只有三个内建的功能呢?

+0

为什么蟒需要这么多的构造个人猜测:它引入语言相当最近,需要适应工作蓄客已经现有的语法(向其他语句中添加'async')你也似乎链接了很多资源来解释各种构造如何工作 - 你的问题没有被文档回答吗? –

+0

我不知道python协同工作是如何工作的,但是如果你需要Lua协程的帮助,我可以:) – warspyking

+0

[Here's](http://sahandsaba.com/understanding-asyncio-node-js-python-3- 4.html)一个很好的帖子在python asyncio如果有点长时间的啰嗦...对于Lua,我一直认为[Documentation](https://www.lua.org/pil/9.1.html)写得很好 – Aaron

我刚刚看到了lua,其中包括sieve.lua live demo。它是使用协程的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。使用sieve.luaLua 5.2.3,堆栈溢出发生在N>530。可以像任何其他对象一样传递生成器对象(代表暂停的协程),并且可以在任何地方将next()内置的应用程序应用于其中,因此python中的协程是一流的。如果我错了,请纠正我。

+0

是的,我知道定义函数gen(x)并不是必须的,因为'x = gen(N)'可以用'x = iter(range(2,N))'来代替。我想接近'sieve.lua'。 – Sunday

+0

通过在[llimits.h](https://www.lua.org/source/5.3/llimits.h.html#LUAI_MAXCCALLS)中加上'LUAI_MAXCCALLS',可以很容易地修复堆栈溢出。 – greatwolf

简单的答案是它们是不同的语言。是的,Python协程是堆叠的,一流的和不对称的。看到这个答案:Coroutine vs Continuation vs Generator

从Lua的documentation

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

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

此外,请参阅Python的开发者邮件列表上的讨论:PEP 492: What is the real goal?