2016-09-24 18 views
16

Luaでのコルーチンのサポートはfunctions in the coroutine table、主にcreate,resumeおよびyieldで提供されています。開発者はこれらのコルーチンをstackful, first-class and asymmetricと記述します。PythonのコルーチンはLuaのコルーチンとどう違うのですか?

コルーチンは、enhanced generators(およびyield from)、またはバージョン3.5で追加されたasync and awaitを使用してPythonで利用できます。

Pythonのコルーチンは、Luaのものとどのように比較されますか?彼らはまた、積み重ねられ、ファーストクラスで非対称ですか? Luaはわずか3組み込み関数とそれらを提供することができながら、

はなぜPythonは、コルーチンのために非常に多くの構造(async defasync withasync forasynchronous comprehensions、...)を必要としますか?

+0

個人的な憶測を既存の構文(他の文に 'async'を追加する)また、さまざまな構文がどのように動作するのかを説明するたくさんのリソースにリンクしているようです。 –

+0

私はPythonのコルーチンがどのように動作するのか分かりませんが、Luaのコルーチンに助けが必要なら私は利用できます:) – warspyking

+0

[ここにある](http://sahandsaba.com/understanding-asyncio-node-js-python-3- 4.html)Python asyncioの良いポスト、ちょっと風が強ければ... Luaのために、私はいつも[ドキュメンテーション](https://www.lua.org/pil/9.1.html)がかなりよく書かれていると思った。 – Aaron

答えて

0

sieve.lua live demoを含むluaを初めて見ました。コルーチンを使ったエラトステネスの篩の実装です。これは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に発生します。

Generatorオブジェクト(中断されたコルーチン)は、他のオブジェクトと同様に渡すことができ、次の組み込み関数を任意の場所に適用できるため、Pythonのコルーチンはファーストクラスです。私が間違っていれば私を修正してください。

+0

はい'x = gen(N)'は 'x = iter(range(2、N)) 'に置き換えることができるので、' gen(x) '関数を定義する必要はないということを知っています。私は 'sieve.lua'に近づきたいと思っていました。 – Sunday

+0

スタックオーバーフローは、[llimits.h](https://www.lua.org/source/5.3/llimits.h.html#LUAI_MAXCCALLS)の 'LUAI_MAXCCALLS'を利用して簡単に修正できます。 – greatwolf

1

単純な答えは、それらが異なる言語であるということです。はい、Pythonのコルーチンは、スタックしていて、ファーストクラスで非対称です。 LuaのdocumentationからCoroutine vs Continuation vs Generator

一部の人々は、非対称コルーチン半コルーチンを呼び出す(彼ら が対称ではないので、彼らは本当に共同ではありません)この回答を参照してください。しかし、他の人 コルーチンは、 補助機能の中にないとき、すなわち、 の保留中の呼び出しがないときに、コルーチンがその実行を中断できるコルーチンの制限された実装 を示すために同じ用語semi-coroutineを使用します。その制御スタック。換言すれば、そのような半コルーチンの本体 しか得られない。 Pythonのジェネレータは、半コルーチンの意味の の例です。

対称コルーチンと非対称コルーチンの違いとは異なり、コルーチンとジェネレータ()の違いは深いものです。ジェネレータは、実際に coroutinesで書くことができるいくつかの興味深い構成を実装するだけの強力ではありません。ルアは真の非対称コルーチンを提供します。 対称コルーチンを好む人は、Luaの非対称の 機能の上にそれらを実装できます。それは簡単な作業です。 (基本的に、それぞれの転送は、 に続いてレジュームされます。また)

、Pythonの開発者メーリングリストにこの議論を参照してください。それは、つい最近の言語に導入し、すでにのオフ構築動作するように適応するために必要だった:Pythonはそんなに構造を必要とする理由についてPEP 492: What is the real goal?

関連する問題