55

ウィキペディアが述べているように:

グリーンスレッドは、ネイティブOS機能に依存せずにマルチスレッド環境をエミュレートし、カーネルスペースではなくユーザースペースで管理されるため、ネイティブスレッドがサポートされていない環境で動作できます。

Pythonのスレッドはとして実装されpthreads (kernel threads)、グローバルインタープリターロック(GIL)のため、Pythonプロセスは一度に1つのスレッドのみを実行します。

[質問]しかしGreen-threads(またはいわゆるグリーンレットまたはタスクレット)の場合、

  1. それらにGIL影響を与えますか?一度に複数のグリーンレットを実行できますか?
  2. グリーンレットまたはタスクレットを使用する際の落とし穴は何ですか?
  3. グリーンレットを使用する場合、プロセスで処理できるグリーンレットはいくつですか?(1つのプロセスで、* ixシステムに設定されているulimit-s-v )までのスレッドを開くことができるので疑問に思い ます。)

私は少し洞察が必要です、そして誰かが彼らの経験を共有するか、正しい道に私を導くことができればそれは助けになるでしょう。

4

2 に答える 2

33

グリーンレットは、協調スレッドのように考えることができます。これが意味するのは、任意の時点でスレッドを先制的に切り替えるスケジューラがないことです。代わりに、グリーンレットは、コード内の指定されたポイントで互いに自発的/明示的に制御を放棄します。

GILはそれらに影響を与えますか?一度に複数のグリーンレットを実行できますか?

一度に実行できるコードパスは1つだけです。利点は、どちらを実行するかを最終的に制御できることです。

グリーンレットまたはタスクレットを使用する際の落とし穴は何ですか?

あなたはもっと注意する必要があります-ひどく書かれたグリーンレットは他のグリーンレットにコントロールを与えません。一方、グリーンレットがいつコンテキストスイッチを行うかがわかっているので、共有データ構造のロックを作成しないことで回避できる場合があります。

グリーンレットを使用する場合、プロセスで処理できるグリーンレットはいくつですか?(単一のプロセスで、* ixシステムで設定されたumask制限までスレッドを開くことができるので疑問に思っています。)

通常のスレッドでは、スケジューラーのオーバーヘッドが多くなります。また、通常のスレッドには、まだ比較的高いコンテキストスイッチのオーバーヘッドがあります。グリーンレットには、このオーバーヘッドが関連付けられていません。ボトルのドキュメントから:

ほとんどのサーバーは、新しいスレッドの切り替えと作成に伴うオーバーヘッドが高いため、ワーカープールのサイズを比較的少数の同時スレッドに制限しています。スレッドはプロセス(フォーク)に比べて安価ですが、新しい接続ごとに作成するには依然としてコストがかかります。

geventモジュールは、ミックスにグリーンレットを追加します。グリーンレットは従来のスレッドと同じように動作しますが、作成するのは非常に安価です。geventベースのサーバーは、ほとんどオーバーヘッドなしで数千のグリーンレット(接続ごとに1つ)を生成できます。個々のグリーンレットをブロックしても、サーバーが新しい要求を受け入れる能力には影響しません。同時接続の数は事実上無制限です。

興味がある場合は、ここでさらに読むこともできます: http ://sdiehl.github.io/gevent-tutorial/

于 2013-05-20T01:48:03.510 に答える
6

私はあなたがevenlet/geventgreenletsについて話していると思います

1)実行できるグリーンレットは1つだけです

2)協調マルチスレッディングです。つまり、グリーンレットが無限ループでスタックすると、プログラム全体がスタックします。通常、グリーンレットは明示的に、またはI/O中にスケジュールされます。

3)スレッドよりもはるかに多く、利用可能なRAMの量によって異なります

于 2012-10-06T12:27:05.363 に答える