2010-06-07 24 views
6

La parte pertinente del código es el siguiente:desove ya la espera de los procesos secundarios en Python

pids = [] 
for size in SIZES: 
    pids.append(os.spawnv(os.P_NOWAIT, RESIZECMD, [RESIZECMD, lotsOfOptions])) 

# Wait for all spawned imagemagick processes to finish 
while pids: 
    (pid, status) = os.waitpid(0, 0) 
    if pid: 
     pids.remove(pid) 

Lo que esto debería estar haciendo está generando todos los procesos de apagado, luego esperar a que cada proceso termine antes de continuar . Lo que hace es trabajar en su mayor parte, pero a veces se cuelga en la siguiente sección (cuando espera que todos estos procesos estén terminados).

¿Hay algún problema con esto? ¿Hay una mejor manera de hacerlo?

El entorno en el que tiene que trabajar es CentOS con Python 2.4, pero estoy probando en Cygwin con Python 2.5, por lo que es posible que falle en mi máquina, pero funcionará en Linux (la máquina Linux es muy lento y este error es raro, así que no he podido conseguirlo allí).

Respuesta

5

la forma recomendada para iniciar el subproceso es utilizar el módulo subprocess.

pipe = Popen(["program", "arg1", "arg2"]) 
pipe.wait() 
3

recomendaría instalar python-subprocess32 - backport robusta de la versión de Python 3 del módulo de la biblioteca estándar subprocess, apto para Python 2.4 a 2.7, y con mucho, la mejor manera de ejecutar subprocesos en Python 2. A continuación, en el bucle que va a hacer

pids.append(subprocess.Popen([RESIZECMD, lot, of, options]) 

y el siguiente bucle será sólo un simple

for pid in pids: 
    pid.wait() 
+0

estoy confundido acerca de por qué me tendría que instalar ese módulo cuando 'subprocess.Popen()' funciona bien en Python 2.4 –

+0

@Brendan, correcciones de errores cruciales, esp. para programas que usan subprocesos y subprocesos, eso se menciona en la página corta que te indiqué, es todo el segundo párrafo. ¿Hay alguna razón por la que necesita la lista completa de soluciones ...? Manejo EINTR, no hay más problemas con FDs grandes, no más FD/manejar fugas ... –

+0

Oh, ya veo. Le pregunté porque este es un proyecto de trabajo y es mucho más fácil si no tengo que instalar nada nuevo. Gracias. –

Cuestiones relacionadas