2

より多くのスレッドを生成するために、Python スクリプトのスタック サイズを縮小しようとしています。このように設定しています

threading.stack_size(32768)

そして、スレッドが開始される前にインポートレベルに置くと、問題は効果がないことです。それの有無にかかわらず、正確な数のスレッドを開始できます。Windows 7 マシン x64 で Python 2.7 x86 を使用しており、2.4GB 以上の RAM が利用可能です。

なぜ効果がないのかについて何か考えはありますか?生成する必要があるスレッドの数についてコメントするのではなく、解決策を本当に探しています。

スレッドに関連する .pyc ファイルに関係していると思われます。これらの .pyc ファイルを削除し、次の実行時に python に再コンパイルさせると変更が適用されるという状況に直面したことを覚えていますが、どのファイルを調整する必要があるかわかりませんスレッドについて。

私が得ることができる助けをいただければ幸いです。

PS Twisted や Asyncore の使用はお勧めしません。それらの方が優れていることはわかっていますが、コード全体を再設計するのではなく、現在の状況に関して最善を尽くす必要があります。

4

3 に答える 3

4

Windows の最小スレッド スタック サイズは、おそらく少なくとも 64kB です。 引用

The operating system rounds up the specified size to the nearest multiple of the
system's allocation granularity (typically 64 KB). To retrieve the allocation
granularity of the current system, use the GetSystemInfo function.

したがって、32kB に設定しようとすると、おそらく 64kB に設定しようとするのと同じように見えます。

さらに、CPythonthreading.stack_sizeは Windows に実装されているため、最初にコミットされたスタックのみを制御します。スタックの予約メモリを制御しようとはしません。同じ場所から:

The reserved memory size represents the total stack allocation in virtual memory.

これは、各スレッドが仮想メモリの予約メモリ サイズを使い果たすことを意味します。エラーが発生する前に作成できるスレッドの数については言及していませんが、プロセスでアドレス可能なメモリを使い果たすのに十分だと思います(Windows 7 x86-64で実行している場合でも、これはおそらく32ビットプロセスです) CPython のビルド/配布が x86(-32) であるため)。

つまり、あなた (あなたのスレッド) がメモリを使用していなくても、システム上により多くの物理メモリがあるとしても、Python はその小さな 32 ビット ポインターで余分なメモリをアドレス指定できないため、新しいスレッドは制限を超えています。再遭遇すると、予約メモリを割り当てることができません (割り当てるアドレスが残っていないため)。

スレッドごとに予約されたメモリを変更できるようにしたい場合は、おそらくCPython が呼び出すのとは異なる方法でCreateThreadorを呼び出す必要があります。_beginthreadexこれはおそらく、CPython を変更する必要があることを意味します。

とはいえ、あなたが私に怒鳴る危険を承知で、あなたがすでに作成できる 1500 スレッド以上のスレッドが必要になるとは思えません。

于 2013-10-17T14:14:23.883 に答える
1

OS には、生成できるスレッド/プロセスの数にも制限があります。Linux (Redhat) では、ulimit -u を使用して確認できます。デフォルトは 1024 プロセス/スレッドです (カーネルは内部的にスレッドをプロセスとして扱います -- http://www.thegeekstuff.com/2013/11/linux-process-and-threads/ )。これは、他の ulimit 値とともに、/etc/security/limits.conf で設定できます。Windows でこれに相当するものがあるかどうかはわかりませんが、これは Linux ユーザーがより多くのスレッド/プロセスを生成できるようにするためのソリューションになります。

于 2016-06-07T18:25:01.650 に答える
0

1 つの可能性は、Python の 64 ビット ビルドを取得することです。そうすれば、アドレス空間の制限に遭遇することはありません。それでも物理メモリによる制限はありますが、それほど重要ではない制限になる可能性があります。他に選択肢がない場合は、RAM を追加購入するという選択肢もあります。唯一の問題は、多くのサード パーティの C 拡張機能が Windows で 64 ビットをサポートしていないか、少なくともデフォルトで 64 ビット ビルドを提供していないことです。一般的な 64 ビット Linux ディストリビューションはデフォルトで 64 ビット Python を使用するため、ソフトウェアが Windows に関連付けられていない場合は、それもオプションになる可能性があります。絶望的な場合は、アプリケーションを Linux VM で実行できます。

twisted のような非同期プログラミング スタイルを使用してコードを書き直したくないという気持ちはよくわかります。より好ましい解決策は、スタックレス Python やイベントレットなどのユーザー空間のグリーン スレッド システムを使用することです。これにはある程度の移植が必要ですが、リアクター ベースのアプローチに切り替えるよりも大幅に少なくなります。繰り返しますが、適切かどうかはアプリケーションによって異なります。

于 2013-10-18T05:01:57.490 に答える