2010-11-24 2 views
29

Twisted、Stackless、Greenlet、Eventlet、Coroutinesはすべて非常に軽量で切り替えが速い非同期ネットワークIOとユーザランドスレッドを使用しているというのは不完全な理解です。しかし、私はそれらの違いは何か分かりません。Python/Erlang:Twisted、Stackless、Greenlet、Eventlet、Coroutinesの違いは何ですか? Erlangのプロセスに似ていますか?

また、Erlangプロセスとよく似ています。彼らはほとんど同じことですか?

私はこのトピックをもっと理解できるよう助けてくれる人なら、大変感謝しています。

答えて

35

まず、ノンブロッキングI/Oは緑色のスレッドまたはコルーチンとは何の共通点もありませんが、スケジューリング方法に影響する可能性があります。今

: - アプリケーションコードのコールバックを使用して非同期スタイルで書かれている

  • Twistedは、古典的な、ノンブロッキングI/Oフレームワークがあります。
  • Geventおよびeventletは、coroutines/greenthreads/greenletsにgreenletライブラリを使用します。イベントループを実行するための専用のグリーンレットが1つあります(イベントコードの場合はlibeventのイベントループです)。任意のグリーンレットが処理するI/O操作を待つのを開始すると、イベントループに実行が渡され、実行のために別のグリーンレットが開始されます(これはI/Oを行う準備ができています)。これは協力マルチタスクと呼ばれ、各グリーンレットは他のグリーンレットにコントロールを戻すときにそれ自身を決定します。
  • Stacklessにはgreenletsに似たタスクレットがありますが、プリエンプティブモデルでスケジュールすることもできます。つまり、スケジューラはいつでもタスクレットの実行を停止し、別のタスクレットの実行を開始できます(OSスレッドとErlangプロセス作業)。また、Stacklessは非ブロッキングI/O機能を提供していないので、stdlib経由でI/Oを実行すると、OSスレッド全体がブロックされるため、Iを待っている間は他のタスクレットは実行できません/ O。スタックレスのためにgeventライブラリのポートを提供しようとする試みがありましたが、どうなっているのでしょうか。
+3

Twistedは、 'twisted.internet.defer.inlineCallbacks'デコレータを介してコールバックとステートマシンを使わずに非同期コードを書くこともできます。このデコレータは、プログラマがコルーチンを生成してコールバックよりもはるかに読みやすいコードを実現します。 –

+0

*イベントループ(...)を実行するための専用のグリーンレットが1つあります*複数のグリーンレットが独自のイベントループを保持することはできませんでした。 –

10

餌を取った! (修正は歓迎します!):

肉眼:ツイスト

  • :シングルスレッド。 'callbacks'と 'deferred'イディオムを使用してノンブロッキング動作を実現します。 node.jsと同様です
  • greenlet/eventlet:non-blocking ioを実現するには、 'green threads'(メモリのセクション?)を使用します。実際には標準のCPython IOにバージョンを適用しているので、コードはブロック/シーケンシャルのように書かれています。
  • スタックレス:http://www.stackless.com/。それを使用していない、それは 'microthreads'と他の細目を追加するように見える? stackless example idioms
  • コルーチン:これらのcoroutines on SO

なしとして光またはErlangのプロセスとしてよくサポートされません。

+0

ツイストは、それ自体がシングルスレッドではなく、スレッドとスレッドプールのファーストクラスサポートを備えています。また、(少なくとも)データベースAPIは、デフォルトでスレッドを使用します。 (さらに、andreypoppの答え​​に私のコメントを参照してください) –

+0

また、andreypopp氏によると、greenletsはノンブロッキングIOとは関係がありません.2つは直交しています。 –

8

Stackless をGreenletと比較するとほぼ正しいです。欠落しているものは次のとおりです。

スタックレス自体はありません何かを追加します。代わりに、Stacklessの5年後に発明されたGreenletは、特定のものを取り除きます。置換インタープリタの代わりに拡張モジュールとして構築するのに十分簡単な形で書かれています。

これは本当に面白いです - Stacklessはさらに多くの機能を備えており、スイッチング時に約10倍の効率があり、実行状態の酸洗いを提供します。

グリーンレットがまだ勝っています。これは、おそらく拡張モジュールとしての使いやすさのためです。だから私はピクレリングでグリーンレットを広げてプロセスを元に戻すことを考えています。

関連する問題