Тупик в подпроцессе Python popen

У меня проблема, когда popen заходит в тупик. В частности, поток (не основной поток), запускающий popen, застревает в:

File: "/usr/lib/python2.7/subprocess.py", line 679, in __init__
  errread, errwrite)
File: "/usr/lib/python2.7/subprocess.py", line 1224, in _execute_child
  data = _eintr_retry_call(os.read, errpipe_read, 1048576)
File: "/usr/lib/python2.7/subprocess.py", line 478, in _eintr_retry_call
  return func(*args)

С помощью ps я вижу, что процесс python разветвляется, но он еще не запустил os.execvp. Это можно увидеть, проверив ps, где я вижу, что есть дочерний процесс моего основного процесса с тем же именем. Завершение этого процесса приводит к возобновлению зависшего потока в родительском.

Насколько я могу судить, дочерний процесс (который будет выполнять execvp) блокируется где-то в 50 строках между его созданием и запуском os.execvp. Чтобы усложнить ситуацию, это редко; может быть, 1 из 100 popens. Как это может произойти? Как мне это исправить? (Я не могу воспроизвести это поведение в простой программе на Python).

Я должен отметить, что, хотя эта программа невероятно многопоточная (работают сотни потоков), никакие другие потоки не разветвляются или не используют popen. Однако многие другие потоки работают с файловыми дескрипторами (в основном с сокетами).

Технические примечания:

  • Запуск на Amazon EC2
  • Linux 3.0.0-14-виртуальный x86_64 в ubuntu 11.10
  • интерпретатор python 2.7.2.
  • Использование нескольких библиотек, включая paramiko и boto
10
задан UsAaR33 11 February 2012 в 04:24
поделиться