Темы Python застряли в Popen.communicate - PullRequest
1 голос
/ 16 сентября 2011

У меня есть приложение Python, которое использует потоки следующим образом:

  1. Создание очереди задач (модуль очереди)
  2. Создание 10 потоков и передача каждому объекту очереди
  3. Поставить задачи в очередь (всего около 8500 задач)
  4. Каждая нить:
    • берет задачу и запускает некоторые команды 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) завершены правильно (когда больше задач не было).

Спасибо за помощь,
Збигнев

1 Ответ

1 голос
/ 16 сентября 2011

В subprocess.py в строке 1131/1132 файловый дескриптор дублируется с помощью os.dup.

По этой причине я подозреваю, что ваша операционная система ограничивает число подпроцессов и/ или количество дескрипторов файлов, доступных для вашего приложения.Однако я не понимаю, почему os.dup не вызывает и не выдает исключение в этом случае.

Попытайтесь выяснить предел вашей операционной системы и остаться ниже этого предела.Для систем на основе UNIX вы, вероятно, можете использовать модуль ресурсов Python (хотя я никогда не использовал его сам): http://docs.python.org/library/resource.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...