У меня есть приложение Python, которое использует потоки следующим образом:
- Создание очереди задач (модуль очереди)
- Создание 10 потоков и передача каждому объекту очереди
- Поставить задачи в очередь (всего около 8500 задач)
- Каждая нить:
- берет задачу и запускает некоторые команды Linux, используя Popen.communicate ()
Мьютексы, критические секции, управление очередями - библиотека пула моего потока была протестирована уже в паре небольших проектов, поэтому нет оснований думать, что там что-то испорчено ...
Все отлично работает, когда у меня до пары тысяч задач, однако, когда у меня больше (в нашем случае более 8500), некоторые потоки зависают. GDB показывает, что они застряли в python subprocess.py в _execute child (строка 1131) -> означает сразу после вызова os.fork () .
ГБД:
(gdb) pystack
/opt/python/current/lib/python2.7/subprocess.py (1131): _execute_child
/opt/python/current/lib/python2.7/subprocess.py (681): __init__
/home/olibsup/tools/chelo/checks/checkUtils/osutils/cmdutils.py (115): shcmd
/home/olibsup/tools/chelo/checks/liblist/libWorkers.py (204): workerFunction
/home/olibsup/tools/chelo/checks/checkUtils/pools/thpool.py (160): run
/opt/python/current/lib/python2.7/threading.py (160): __bootstrap_inner
/opt/python/current/lib/python2.7/threading.py (553): __bootstrap
Мой ulimit показывает:
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
pending signals (-i) 139264
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
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 139264
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
'top' также не показывает ничего подозрительного (по крайней мере, мне):
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16438200k total, 15705272k used, 732928k free, 751640k buffers
Swap: 3148700k total, 44k used, 3148656k free, 11692300k cached
У вас есть идеи, почему там висят темы?
Не все потоки зависают, некоторые (5 из 10) завершены правильно (когда больше задач не было).
Спасибо за помощь,
Збигнев