あなたが疑われるように、これはおそらく、スレッドの問題です。cp_max
数の上限を設定しますしかし、スレッドプール内のスレッドの数は非常に多いですが、プロセスはこの制限をはるかに下回っている可能性が非常に高く、スレッド数が約200個の場合はスレッドごとに独自のスタックがあるため、
これは、プログラムを実行する前にスタックサイズulimitの設定(私はbash
を使用しています)を調整することで確認できます。つまり、
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
max nice (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 32750
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
max rt priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 32750
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
マシンのデフォルトスタックサイズは10240Kで、この設定では約300スレッドを作成できることがわかりました。スタックサイズを1024Kに調整する(ulimit -s 1024
を使用)私は約3000のスレッドを作成できます。
このスクリプトを使用して、あなたのシステム上のスレッド作成の制限に関するいくつかのアイデアを得ることができます。
from thread import start_new_thread
from time import sleep
def sleeper():
try:
while 1:
sleep(10000)
except:
if running: raise
def test():
global running
n = 0
running = True
try:
while 1:
start_new_thread(sleeper,())
n += 1
except Exception, e:
running = False
print 'Exception raised:', e
print 'Biggest number of threads:', n
if __name__ == '__main__':
test()
これはあなたの問題がConnectionPool
スレッドのメモリ要件によって異なります解決かどうか。
ありがとう、問題解決済み! – user68488
おそらく答えを受け入れるべきですか?また、Python> = 2.5のスレッドモジュールには、stack_size(min 32K)を直接設定できるstack_size()関数があります。 – mhawke
もう一度おねがいします!私はわずか11の評判ポイントがありますが、投票するには15が必要です。 – user68488