2

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が十分にあることを考えると、スレッド数を増やすのに役立つ可能性/解決策はありますか?

よろしくお願いします。

4

1 に答える 1

3

それほど多くのスレッドは必要ありません。私はあなたがそう信じていることを理解していますが、-いいえ、そうではありません;-)

とはいえ、あなたが呼んでいる方法はstack_size()効果がありません。スレッドの作成後にスタック サイズを変更することはできません。スレッドを作成するに変更する必要があります。だからこれを動かしてください:

    threading.stack_size(64*1024)

スレッドを作成する前に、一度だけ実行されます。それが役立つかどうかはわかりませんが、それが正しい方法であり、あなたが行っている方法は無駄です。それが役立つことを願っています!

于 2013-10-17T00:00:53.027 に答える