2012-02-11 13 views
9

Ho un problema in cui il popen è deadlocking. In particolare, il filo (non il thread principale), che gestisce il popen è bloccato a:Deadlock nel sottoprocesso di Python

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, posso vedere che il processo di pitone si è biforcuta, ma non è ancora eseguito os.execvp. Questo può essere visto controllando ps, dove vedo che c'è un processo figlio del mio processo principale con lo stesso nome. Uccidere quel processo fa riprendere il thread bloccato nel genitore.

Per quanto ne so, il processo figlio (che eseguirà execvp) si bloccherà da qualche parte nelle 50 righe tra la sua creazione e l'esecuzione di os.execvp. A complicare le cose, è raro; forse 1 su 100 popens. Come può verificarsi questo blocco? Come lo aggiusto? (Non riesco a riprodurre questo comportamento in un semplice programma python).

Devo notare che mentre questo programma è incredibilmente multithread (centinaia di thread in esecuzione), nessun altro thread biforca o usa il popen. Molti altri thread funzionano con i descrittori di file (principalmente socket).

Note tecniche:

  • esecuzione su Amazon EC2
  • Linux x86_64 3.0.0-14-virtuale in Ubuntu 11.10
  • Python 2.7.2 interprete.
  • Utilizzando diverse biblioteche, tra cui paramiko e boto

risposta

Problemi correlati