Windows 7 x64 で Python 2.7 x86 を使用しています。とにかく、私がコーディングするアプリケーションはほとんどのx86マシンで使用されるため、今のところx86用のPython 2.7に固執したいと思います。
現在、私が取り組んでいるスクリプトは、約 700 スレッドで問題なく動作します。私はキューを使用しています。スレッドを増やす必要が出てきたので、当然、スレッドを増やしましたが、効果はありませんでした。スクリプトは「新しいスレッドを開始できません」という例外でクラッシュします。
それで、stackoverflowでここをたくさん掘り下げた後、threading.stack_size()を使用するというアイデアを見つけました。それに関するpythonのドキュメントも読みました。だから私は先に進んでこれをしました:
threading.stack_size(64*1024)
問題は、効果がないことです。十分なRAMが空いていても(2.4GB近く)、700を超えるスレッドを生成できません
理解を深めるために、これが収まるコードの一部を次に示します。
class Downloader(threading.Thread):
#----------------------------------------------------------------------
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
#----------------------------------------------------------------------
def run(self):
while True:
host,user,page= self.queue.get()
self.checker(host,user,page)
self.queue.task_done()
threading.stack_size(64*1024)
この問題について何時間も検索した後、私がたどり着いた唯一の解決策は、python をまとめて再コンパイルし、スタック サイズに関するその部分を編集することでした。そのオプションは私より上にあり、私の問題に対する別のエレガントな解決策があると確信しています。
Res Monitor を確認しましたが、使用可能なスタンバイ メモリが十分にあり、アイドル メモリもあります。単に 700 マーカーを通過することを拒否します。stack_size() を間違って使用していますか? Twisted / asyncore を使用するようにアドバイスしないでください!
私が理解していることから、それは仮想空間の割り当てにも関係しています。RAMが十分にあることを考えると、スレッド数を増やすのに役立つ可能性/解決策はありますか?
よろしくお願いします。