Тупик в подпроцессе Python popen - PullRequest
10 голосов
/ 11 февраля 2012

У меня проблема, когда 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 человек. Как это может произойти? Как мне это исправить? (Я не могу воспроизвести это поведение в простой программе на Python).

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

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

  • Запуск на Amazon EC2
  • Linux 3.0.0-14-virtual x86_64 в Ubuntu 11.10
  • интерпретатор Python 2.7.2.
  • Использование нескольких библиотек, включая paramiko и boto

1 Ответ

3 голосов
/ 13 февраля 2012

Похоже, что это недавняя ошибка Python 2.7.2:

http://bugs.python.org/issue13817

...