2010-09-10 10 views
7

Solía ​​multiprocesamiento pitón y hago espera de todos los procesos con este código:pitón piscina multiprocesamiento, esperar a que los procesos y reiniciar encargo procesa

... 
      results = [] 
      for i in range(num_extract): 
       url = queue.get(timeout=5) 
       try: 
        print "START PROCESS!" 
        result = pool.apply_async(process, [host,url],callback=callback) 
        results.append(result) 
       except Exception,e: 

        continue 


      for r in results: 
       r.get(timeout=7) 
... 

intento utilizar pool.join pero consigue el error:

Traceback (most recent call last): 
    File "C:\workspace\sdl\lxchg\walker4.py", line 163, in <module> 
    pool.join() 
    File "C:\Python25\Lib\site-packages\multiprocessing\pool.py", line 338, in joi 
n 
    assert self._state in (CLOSE, TERMINATE) 
AssertionError 

¿Por qué unir no funciona? Y cuál es la mejor manera de esperar todos los procesos.

Mi segunda pregunta es ¿cómo puedo reiniciar cierto proceso en el grupo? Necesito esto en razón de la pérdida de memoria. Ahora, de hecho, reconstruyo todo el grupo después de que todos los procesos realizaron sus tareas (crear un nuevo conjunto de objetos para reiniciar el proceso).

Lo que necesito: por ejemplo, tengo 4 procesos en el grupo. Luego, procese su tarea, una vez que la tarea finalice, necesito eliminar el proceso y comenzar de nuevo (para actualizar la fuga de memoria).

+1

¿por qué 'multiprocessing/pool.py' vive en' site-packages' y no directamente en 'Lib'? Si has estado pirateando, entonces necesitamos saber algo. – aaronasterling

+0

hmm .. no sé, lo instalo con el instalador de windows ... obtenido en el sitio oficial ... – Evg

+0

tengo python2.5 – Evg

Respuesta

17

que está recibiendo el error porque necesita llamar pool.close() antes de llamar pool.join()

No sé de una buena manera de cerrar un proceso comenzó con apply_async pero ver si apagarlo correctamente la piscina no lo hace haga que su fuga de memoria desaparezca.

La razón por la que creo que esto es que la clase Pool tiene un conjunto de atributos que son subprocesos que se ejecutan en modo daemon. Todos estos hilos se limpian con el método join. El código que tienes ahora no los limpiará así que si creas un nuevo Pool, aún tendrás todos esos hilos ejecutándose desde el último.

+0

thnx con cierre funciona. – Evg

+0

sobre el grupo quiero decir que parece que los procesos de uso de grupo crean de principio a fin. Mi script lleva mucho tiempo en el trabajo y con el tiempo todos los procesos de pool comienzan a crecer en la memoria, quiero restablecer el uso de la memoria del proceso de vez en cuando (cada nueva tarea para el proceso) y el reinicio del proceso es una forma de hacerlo. . Creo que – Evg

+0

lo siento no quiero decir pérdida de memoria me refiero a simple crecimiento en la memoria del proceso y el control de este proceso de reinicio mediante el reinicio. – Evg

Cuestiones relacionadas