2012-08-26 62 views
6

que tienen pitón escritura run.py:ejecutar varios programas en Python, al mismo tiempo

def do(i): 
    # doing something with i, that takes time 

start_i = sys.argv[1] 
end_i = sys.argv[2] 
for i in range(start_i, end_i): 
    do(i) 

Luego ejecutar este script:

python run.py 0 1000000 

Después de 30 minutos se completa la escritura. Pero, es demasiado tiempo para mí.

Por lo tanto, creo escritura del golpe run.sh:

python run.py 0 200000 & 
python run.py 200000 400000 & 
python run.py 400000 600000 & 
python run.py 600000 800000 & 
python run.py 800000 1000000 

Luego ejecutar este script:

bash run.sh 

A los 6 minutos de la escritura se ha completado. Bastante bien. Estoy feliz.

Pero creo que hay otra forma de resolver el problema (sin crear el script bash), ¿verdad?

Respuesta

10

Usted está buscando el paquete multiprocessing, y especialmente la clase Pool:

from multiprocessing import Pool 
p = Pool(5) # like in your example, running five separate processes 
p.map(do, range(start_i, end_i)) 

además de consolidar esto en un solo comando, esto tiene otras ventajas sobre el enfoque de llamar python run.py 0 200000 & etc. Si algunos procesos tienen más tiempo que otros (y por lo tanto, python run.py 0 200000 puede terminar antes que los demás), esto asegurará que los 5 subprocesos sigan trabajando hasta que todos estén terminados.

Tenga en cuenta que dependiendo de la arquitectura de su computadora, ejecutar demasiados procesos al mismo tiempo puede ralentizarlos (para empezar, depende de cuántos núcleos tenga su procesador, y qué más está ejecutando al mismo hora).

+0

Lo acabo de probar. ¡Funciona tan bien! Muchas gracias – imkost

+0

Eres bienvenido –

+1

@imkost: si no usas los valores devueltos 'p.map()', entonces podrías usar 'para _ en p.imap_unordered (do, range (start_i, end_i)): pase'. – jfs

0

Puede hacer que su programa python cree los procesos independientes, en lugar de hacerlo bash, pero eso no es muy diferente. ¿De qué se trata tu solución que encuentras deficiente?

+0

Me gustaría tener solo una secuencia de comandos python – imkost

+0

@imkost: ¿y no puedes hacer 'python run.py 0 1000000'? –

+0

@JoelCornett: esto toma demasiado tiempo para completar el script – imkost

Cuestiones relacionadas