Entiendo que usar subprocess es la forma preferida de llamar a un comando externo.Controlar el número de subprocesos usando para llamar comandos externos en python
Pero, ¿y si quiero ejecutar varios comandos en parall, pero limitar el número de procesos que se generan? Lo que me molesta es que no puedo bloquear los subprocesos. Por ejemplo, si me llaman
subprocess.Popen(cmd, stderr=outputfile, stdout=outputfile)
A continuación, el proceso continuará, sin esperar a que cmd
a fin. Por lo tanto, no puedo concluir en un trabajador de la biblioteca multiprocessing
.
Por ejemplo, si hago:
def worker(cmd):
subprocess.Popen(cmd, stderr=outputfile, stdout=outputfile);
pool = Pool(processes = 10);
results =[pool.apply_async(worker, [cmd]) for cmd in cmd_list];
ans = [res.get() for res in results];
entonces cada trabajador va a terminar y regresar después del desove un subproceso. Así que no puedo limitar el número de procesos generados por subprocess
usando Pool
.
¿Cuál es la forma correcta de limitar el número de subprocesos?
Esto desactiva el procesamiento paralelo completamente – qed
No debería. La pregunta es usar el módulo 'multiprocesamiento', y cada trabajador se genera en un proceso separado, por lo que' esperar() 'en un trabajador no impedirá que otros trabajadores se ejecuten. Dicho esto, esto no es correcto en sí mismo: este ejemplo no 'devuelve' nada al trabajador, por lo que al llamar '.get()' a los resultados no se devolverá nada. – larsks