2012-02-11 25 views
9

Tengo un problema donde popen está bloqueando. En concreto, el hilo (no el hilo principal) que se ejecuta el popen se ha quedado atascado en:Interbloqueo en el subproceso de Python 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) 

con PS, puedo ver que el proceso de pitón se ha dividido en sí, pero todavía no se ha ejecutado os.execvp. Esto se puede ver al marcar ps, donde veo que hay un proceso hijo de mi proceso principal con el mismo nombre. Al matar ese proceso, se reanuda el hilo atascado en el padre.

Por lo que puedo decir, el proceso secundario (que se ejecutará) se bloquea en alguna parte de las 50 líneas entre su creación y la ejecución de os.execvp. Para complicar las cosas, es raro; tal vez 1 en 100 popens. ¿Cómo puede ocurrir este bloqueo? ¿Cómo lo arreglo? (No puedo reproducir este comportamiento en un programa simple de Python).

Debo señalar que aunque este programa es increíblemente multiproceso (cientos de subprocesos en ejecución), ningún otro subproceso se bifurca ni usa popen. Sin embargo, muchos otros subprocesos trabajan con descriptores de archivos (principalmente sockets).

Notas técnicas:

  • Correr en Amazon EC2
  • Linux x86_64-3.0.0-14 virtual en Ubuntu 11.10
  • Python 2.7.2 intérprete.
  • Usando varias bibliotecas incluyendo paramiko y boto

Respuesta

Cuestiones relacionadas