2

多くのクライアントを実行している単一のコンピューターと Twisted を使用する複数のサーバーの間でメッセージを送受信する簡単なプログラムを作成しています。これらのメッセージへの返信には、かなり長い計算が必要です。そのため、メッセージの受信をブロックしないように、クライアントとサーバーの両方に実装deferToThread()しました。Callback()

ただし、同時に処理できる同時アクティブ接続の数を最大にしたいと考えています。現状では、私のプログラムは 10 の同時アクティブ接続を処理できると思います (クライアントまたはサーバーのいずれかで応答の計算を実行する 10 のスレッドのように)。これがアクティブな接続のデフォルト数であることは理にかなっていますsuggestThreadPoolSize()か?

4

1 に答える 1

4

プログラムが CPU バウンドの場合、Python のグローバル インタープリター ロックによりマルチ CPU の同時実行が妨げられるため、スレッド プールのサイズをいじっても、プログラムが新しい接続を処理できる速度に実質的な影響はありません。 .

代わりに、 を使用reactor.spawnProcessしてサブプロセスを開始し、CPU を集中的に使用する作業をサブプロセスのプールに移動する必要があります。アンプルのようなものは、これをより便利に行うのに役立つかもしれません.

ただし、複数のプロセスを使用しても、所有している CPU と同数の CPU 同時実行しか購入できません。(まあ、実際にはコア、またはハイパースレッドですが、少なくとも「論理」CPU です。)実際にその作業を行うための利用可能なリソースがない場合に、より多くの作業を受け入れると、メモリ内に巨大なバッファーが構築され、最終的にはクラッシュします。プログラム。最終的には backpressure を適用する必要があります。

Twisted は、現在これを行うために必要なすべてのツールを提供していますが、さらに簡単にするために取り組んでいます。

ああ、これは言うまでもありませんが、プログラムCPU バウンドでない場合は、スレッドの使用をやめるべきです ;-)。

于 2013-06-06T04:24:23.787 に答える