2

300 のスレッドを生成する Python スクリプトがあります。各スレッドは特定のポートのソケットに接続し、ソケットを閉じるまで平均で約 500 文字を受け取ります。

私は現在、このセットアップを持っています:

threading.stack_size(524288)

これは 512KB を意味します。わずか 128KB を使用して試してみたところ、非常に小規模な一連のテストで問題なく動作しました。しかし、自分のしていることが正しいかどうかはわかりません。理想的には、サイズを 128KB よりもさらに小さく設定したいと考えています。

それで、私の質問は、私が持っている一種のソケット接続で、AVERAGEで使用できるRAMの量はどれくらいですか? どういうわけか非標準的な質問であることはわかっていますし、さまざまな点でさまざまであることはわかっていますが、平均的な数字を聞きたいだけです. 64KB かそれ以下を使用しても大丈夫でしょうか?

お時間を割いてお読みいただきありがとうございました。回答をお待ちしております。

よろしく。

スレッドの良い例は、電子メールを送信しようとする試みです。

4

1 に答える 1

7

によって設定されるスタックサイズthreading.stack_sizeは、スレッド内のコール スタックに割り当てるメモリの量です。

この量は、スレッドの作成時に割り当てる必要があります。変更できません。

当然のことながら (私は願っています)、この値はコール スタックに存在できるフレームの数を制限します。驚くべきことに (おそらく) これは C のコール スタックに適用され、Python のコール スタックには適用されません。

CPython では、Python コール スタックと C コール スタックは相互に関連していますが、それらは別のものです。

これは、スレッドで実行する Python コードが十分な数の呼び出しを行い、C コール スタックを十分に深くして、使用を許可した以上のメモリを必要とするthreading.stack_size場合、Python プロセスがクラッシュすることを意味します。

したがって、これを微調整しすぎると、アプリケーションの信頼性が低下し、不可解なクラッシュとして障害が発生することがわかります。

繰り返しますが、ここには 2 つの概念があります。まず、スレッドの開始時に実際に割り当てられるメモリの量があります。これは によって制御されthreading.stack_sizeます。次に、スレッドのコール スタックが実際に使用する必要があるメモリの量があります。プログラムが機能するためには、前者常に少なくとも後者と同じ大きさでなければなりません。前者は使用して制御threading.stack_sizeできますが、後者はプログラムの書き方によってのみ制御できます。

メモリを節約したい場合は、代わりに非ブロッキング ソケットをすべて 1 つのスレッドで使用することを検討してください (単純に非ブロッキング ソケットを使用してもメモリ使用量は減りませんが、300 スレッドの代わりに 1 つのスレッドを使用するとメモリ使用量は確実に減ります)。

于 2013-10-16T15:19:25.457 に答える