У меня проблема, когда 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. Однако многие другие потоки работают с файловыми дескрипторами (в основном с сокетами).
Технические примечания: