Esto es lo que estoy tratando de lograr -pitón -> módulo de multiprocesamiento
- Tengo cerca de un millón de archivos que necesito para analizar & anexar el contenido analizada en un solo archivo.
- Dado que un único proceso lleva años, esta opción está desactivada.
- No usar subprocesos en Python, ya que básicamente se trata de ejecutar un único proceso (debido a GIL).
- Por lo tanto, utilizando el módulo de multiprocesamiento. es decir, engendrando 4 subprocesos para utilizar todo ese poder de núcleo sin procesar :)
Hasta ahora todo bien, ahora necesito un objeto compartido al que tengan acceso todos los subprocesos. Estoy usando Colas del módulo de multiprocesamiento. Además, todos los subprocesos necesitan escribir su salida en un solo archivo. Un lugar potencial para usar Locks, supongo. Con esta configuración cuando corro, no obtengo ningún error (por lo que el proceso principal parece correcto), simplemente se detiene. Cuando presiono ctrl-C veo un traceback (uno para cada subproceso). Tampoco se escribe ninguna salida en el archivo de salida. Aquí está el código (tenga en cuenta que todo funciona bien sin multi-procesos) -
import os
import glob
from multiprocessing import Process, Queue, Pool
data_file = open('out.txt', 'w+')
def worker(task_queue):
for file in iter(task_queue.get, 'STOP'):
data = mine_imdb_page(os.path.join(DATA_DIR, file))
if data:
data_file.write(repr(data)+'\n')
return
def main():
task_queue = Queue()
for file in glob.glob('*.csv'):
task_queue.put(file)
task_queue.put('STOP') # so that worker processes know when to stop
# this is the block of code that needs correction.
if multi_process:
# One way to spawn 4 processes
# pool = Pool(processes=4) #Start worker processes
# res = pool.apply_async(worker, [task_queue, data_file])
# But I chose to do it like this for now.
for i in range(4):
proc = Process(target=worker, args=[task_queue])
proc.start()
else: # single process mode is working fine!
worker(task_queue)
data_file.close()
return
¿qué estoy haciendo mal? También intenté pasar el archivo_objeto abierto a cada uno de los procesos en el momento del desove. Pero sin efecto. por ejemplo, Process(target=worker, args=[task_queue, data_file])
. Pero esto no cambió nada. Siento que los subprocesos no pueden escribir en el archivo por alguna razón. O bien la instancia del file_object
no se está replicando (en el momento del engendro) o alguna otra peculiaridad ... ¿Alguien tuvo una idea?
EXTRA: también ¿Hay alguna manera de mantener un mysql_connection persistente abierta & pase a través a los sub_processes? Así que abro una conexión mysql en mi proceso principal & la conexión abierta debe ser accesible para todos mis subprocesos. Básicamente, esto es el equivalente de una memoria compartida en python. Alguna idea aqui?
Si no escribe en el archivo pero imprime, ¿funciona entonces? (En Linux haría python script.py> out.dat para evitar inundaciones de pantalla). – extraneon
Y creo que proc.start no es bloqueante, por lo que probablemente debería esperar en algún lugar para dar al proceso la oportunidad de hacer un trabajo antes de hacer el archivo de datos.close() – extraneon
data_file.close() se hace al final. ¿Debería afectar aquí? También la impresión funciona bien. Veo el resultado en la pantalla cuando uso print ... Pero quiero usar el archivo. ¡ayuda! También, ¿hay alguna forma de mantener abierta una mysql_connection persistente y pasarla a los sub_processes? –