Comme vous pensez, cela est probablement un problème de filetage. cp_max
fixe une limite supérieure pour le nombre des threads dans le pool de threads, cependant, votre processus risque de manquer de mémoire bien en dessous de cette limite, dans votre cas autour de 200 threads.Chaque thread a sa propre pile, la mémoire totale utilisée par votre processus atteint la limite du système
Vous pouvez vérifier cela en ajustant le paramètre ulimit de la taille de la pile (J'utilise bash
) avant d'exécuter votre programme, par exemple
$ 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
Vous pouvez voir que la taille de la pile par défaut est 10240K sur ma machine et j'ai trouvé que je peux créer environ 300 threads avec ce paramètre. Ajustement de la taille de la pile à 1024K (en utilisant ulimit -s 1024
) Je peux créer environ 3000 threads.
Vous pouvez avoir une idée sur les limites de la création de fil sur votre système en utilisant ce script:
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()
Que cela résout votre problème dépendra des besoins en mémoire des ConnectionPool
threads.
Merci beaucoup, problème résolu! – user68488
Peut-être que vous devriez accepter la réponse alors? En outre, le module thread dans python> = 2.5 a une fonction stack_size() où vous pouvez directement définir la taille de la pile (min 32K). – mhawke
Merci encore! Je n'ai que 11 points de réputation mais j'ai besoin de 15 pour voter :( – user68488