2009-12-17 11 views
14

Estoy escribiendo algunos códigos de multiprocesamiento (Python 2.6.4, WinXP) que generan procesos para ejecutar tareas en segundo plano. Al jugar con algunos ejemplos triviales, me encuentro con un problema donde mi código genera continuamente nuevos procesos, aunque solo digo que genere un número fijo.Multiprocesamiento al iniciar demasiadas instancias de Python VM

El programa en sí funciona bien, pero si miro en Windows TaskManager, sigo viendo nuevos procesos 'python.exe'. Simplemente siguen generando más y más a medida que el programa se ejecuta (eventualmente muriendo de hambre a mi máquina).


Por ejemplo,
yo esperaría que el código de abajo para poner en marcha los procesos 2 python.exe. El primero es el programa en sí, y el segundo es el proceso secundario que engendra. ¿Alguna idea de lo que estoy haciendo mal?

import time 
import multiprocessing 


class Agent(multiprocessing.Process): 
    def __init__(self, i): 
     multiprocessing.Process.__init__(self) 
     self.i = i 

    def run(self): 
     while True: 
      print 'hello from %i' % self.i 
      time.sleep(1) 


agent = Agent(1) 
agent.start() 

Respuesta

20

Parece que no siguió cuidadosamente las instrucciones en la documentación, específicamente this section donde se habla de "importación segura del módulo principal".

Necesita proteger su código de inicio con un bloque if __name__ == '__main__': o obtendrá lo que está consiguiendo, creo.

Creo que se trata de que el módulo de multiprocesamiento no puede usar os.fork() como lo hace en Linux, donde un proceso que ya se está ejecutando se clona básicamente en la memoria. En Windows (que no tiene tal fork()) debe ejecutar un nuevo intérprete de Python e indicarle que importe su módulo principal y luego ejecute el método start/run una vez hecho esto. Si tiene un código en "nivel de módulo", desprotegido por la comprobación de nombre, durante la importación comienza de nuevo la secuencia completa, ad infinitum

+0

eso fue todo !! wow ... comportamiento extraño de hecho. –

+1

no es raro una vez que comprenda la implementación, que es exactamente lo que Peter señala. – jnoller

+0

@jnoller, no es obvio a menos que mires con cuidado, pero Corey hizo su comentario antes de editar mi respuesta para agregar la aclaración. –

0

Cuando ejecuto esto en Linux con python2.6, veo un máximo de 4 procesos python2.6 y no puede garantizar que todos son de este proceso. Definitivamente no están llenando la máquina.

¿Necesita una nueva versión de python? ¿Diferencia de Linux/Windows?

+0

Si desea ver las relaciones entre procesos en general en Linux, puede usar " ps axjf "para obtener una especie de vista de árbol de los procesos. –

+0

Estoy en la versión más reciente de Python 2.x (2.6.4) –

0

No veo nada de malo en eso. Funciona bien en Ubuntu 9.10 (Python 2.6.4).

¿Estás seguro de que no tienes cron o algo que inicie varias copias de tu script? ¿O que la secuencia de comandos generada no está llamando a nada que inicie una nueva instancia, por ejemplo, como un efecto secundario de la importación si su código se ejecuta directamente en la importación?

+0

Estoy seguro de que solo está comenzando una versión única. esto es totalmente extraño. Simplemente sigue generando y generando en mi máquina. gracias por verificar en * nix. –

Cuestiones relacionadas