2

最大 500 のスレッドを生成する Web クローラー スクリプトで、各スレッドは基本的に、リモート サーバーから提供される特定のデータを要求します。各サーバーの応答は、内容とサイズが他とは異なります。

スレッドのstack_sizeを756Kに設定しています

threading.stack_size(756*1024)

これにより、必要な十分な数のスレッドを確保し、ほとんどのジョブと要求を完了することができます。しかし、一部のサーバーの応答は他のサーバーよりも大きく、スレッドがそのような応答を受け取ると、スクリプトは SIGSEGV で終了します。

stack_sizes が 756K を超えると、必要な数のスレッドを同時に持つことができなくなります。

クラッシュせずに特定の stack_size を続行するにはどうすればよいかについての提案はありますか? 特定のスレッドの現在使用されているstack_sizeを取得するにはどうすればよいですか?

4

1 に答える 1

10

なぜ500個のスレッドを生成しているのですか? それはひどい考えのようです!

スレッドを完全に削除し、イベント ループを使用してクロールを実行します。あなたのプログラムは、より速く、よりシンプルになり、維持しやすくなります。

ネットワークを待っているスレッドがたくさんあっても、プログラムの待ち時間が速くなるわけではありません。代わりに、開いているすべてのソケットをリストに集めてループを実行し、それらのいずれかに利用可能なデータがあるかどうかを確認します。

Twistedの使用をお勧めします - これはイベント駆動型のネットワーク エンジンです。非常に柔軟で、安全で、スケーラブルで、非常に安定しています (セグメンテーション違反はありません)。

また、 Scrapyを見ることもできます。これは、Python/Twisted で記述された Web クロールおよびスクリーン スクレイピング フレームワークです。まだ大規模な開発中ですが、いくつかのアイデアを得ることができるかもしれません。

于 2008-12-27T11:28:29.317 に答える