web-dev-qa-db-ja.com

緑のスレッドとPython

ウィキペディアの状態

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

Pythonのスレッドはpthreads (kernel threads)として実装されており、グローバルインタープリターロック(GIL)により、Pythonプロセスは一度に1つのスレッドしか実行しません。

[[〜#〜] question [〜#〜]]ただし、Green-threads(または、いわゆるグリーンレットまたはタスクレット)、

  1. GILはそれらに影響しますか?一度に複数のGreenletを実行できますか?
  2. GreenletまたはTaskletを使用する際の落とし穴は何ですか?
  3. Greenletを使用する場合、プロセスが処理できるGreenletの数はいくつですか? (単一のプロセスで最大ulimit-s-v)を* ixシステムに設定します。)

私は少し洞察が必要です。誰かが彼らの経験を共有したり、私を正しい道に案内したりするのに役立ちます。

41
Rahul Gautam

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

GILはそれらに影響を与えますか?一度に複数のGreenletを実行できますか?

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

GreenletまたはTaskletを使用する際の落とし穴は何ですか?

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

Greenletを使用する場合、プロセスが処理できるGreenletの数はいくつですか? (* ixシステムで設定されたumask制限までスレッドを1つのプロセスで開くことができるので、私は不思議に思っています。)

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

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

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

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

20
Martin Konecny

あなたはevenlet/gevent greenletsについて話していると思います

1)実行中のGreenletは1つだけです。

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

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

4
rguillebert