У меня проблема, когда 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