30

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

また、Erlang プロセスに非常に似ています。それらはほとんど同じものですか?

このトピックをより理解するのを手伝ってくれる人なら誰でも大歓迎です。

4

3 に答える 3

38

まず第一に、ノンブロッキング I/O はグリーン スレッドやコルーチンと共通点はありませんが、それらのスケジュール方法に影響を与える可能性があります。

今:

  • Twistedは古典的なノンブロッキング I/O フレームワークです。アプリケーション コードは、コールバックを使用して非同期スタイルで記述されます。
  • Geventeventletは、コルーチン/greenthreads/greenletsにgreenletライブラリを使用します。eventloop を実行するための専用の greenlet が 1 つあります (gevent の場合は、C コードのlibeventのイベント ループです)。任意の greenlet が何らかの I/O 操作の処理を待機し始めると、イベント ループに実行が与えられ、実行のために別の greenlet が開始されます (これは何らかの I/O を実行する準備ができています)。これは協調的マルチタスキングと呼ばれます — 各 greenlet は、いつ制御を他の greenlet に戻すかを決定します。
  • スタックレスには、グリーンレットに似たタスクレットがありますが、プリエンプティブ モデルでスケジュールすることもできます。つまり、スケジューラーはいつでもタスクレットの実行を停止し、別のタスクレットの実行を開始できます (これが OS スレッドと Erlang プロセスのしくみです)。また、Stackless はすぐに使用できる非ブロッキング I/O 機能を提供しないため、stdlib を介して I/O を実行すると、OS スレッド全体がブロックされるため、I を待機している間は他のタスクレットを実行できません。 /O. Stackless 用の gevent ライブラリのポートを提供する試みがありましたが、それがどのように進んでいるかはわかりません。
于 2010-11-24T06:26:55.447 に答える
11

Stackless と Greenlet を比較すると、ほとんど正しいです。欠けているものは次のとおりです。

スタックレス自体は何も追加しません。代わりに、Stackless の 5 年後に発明された Greenlet は、特定のものを削除します。代替インタープリターの代わりに拡張モジュールとしてビルドできるほどシンプルに書かれています。

これは本当に面白いです。Stackless にはさらに多くの機能があり、スイッチングの効率が約 10 倍高く、実行状態のピクルを提供します。

おそらく拡張モジュールとして使いやすいという理由だけで、Greenlet は依然として勝っています。そこで、ピクルスで Greenlet を拡張してプロセスを元に戻すことを考えています。多分それはまた絵を変えるでしょう:-)

于 2012-03-18T20:43:55.767 に答える
11

エサ取り!(修正は大歓迎です!):

全体的に:

  • ツイスト: シングルスレッド。「コールバック」と「据え置き」イディオムを使用して、非ブロッキング動作を実現します。node.js に似ています。
  • greenlet / eventlet : 「グリーン スレッド」(メモリのセクション?) を使用して、非ブロッキング io を実現します。実際には、標準の CPython IO にそのバージョンでパッチを適用するため、コードは依然としてブロック/シーケンシャルであるかのように記述されます。
  • スタックレス: http://www.stackless.com/ . 使用していませんが、「マイクロスレッド」やその他の機能が追加されているように見えますか? スタックレスのイディオムの例
  • コルーチン: SO のコルーチン

これらはいずれも、Erlang プロセスほど軽く、十分にサポートされていません。

于 2010-11-24T04:13:23.923 に答える