2016-09-24 105 views
16

支持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

回答

0

我剛剛看到了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

1

簡單的答案是它們是不同的語言。是的,Python協程是堆疊的,一流的和不對稱的。看到這個答案:Coroutine vs Continuation vs Generator

從Lua的documentation

有些人稱之爲非對稱協程半協同程序(因爲它們 是不對稱的,他們是不是真的CO)。但是,其他人使用相同的術語半協同程序來表示協程的受限制的實現 ,其中協程只能在 它不在任何輔助功能內時掛起它的執行,也就是說,當它沒有 掛起的調用時其控制堆棧。換句話說,只有這種半協程的主體 可以屈服。 Python中的生成器就是半協程的這個含義的例子 。

與對稱和不對稱協同程序之間的區別不同,協程和生成程序之間的區別(如Python中所示) 是一個很深的區別;發電機不足以實現 幾個有趣的結構,我們可以用真正的 協程編寫。 Lua提供了真正的不對稱協程。那些喜歡 對稱協程的人可以在Lua的不對稱 工具之上實現它們。這是一件容易的事。 (基本上,每次轉賬都是收益率爲 ,然後是簡歷。)

此外,請參閱Python的開發者郵件列表上的討論:PEP 492: What is the real goal?