Actualmente estoy usando el módulo de multiprocesamiento de Python con un grupo para ejecutar una función millones de veces, simultáneamente. Si bien el multiprocesamiento funciona bien, la función es tan liviana que apenas se usa el 30% de cada núcleo y los subprocesos se maximizan solo durante el bloqueo (). Mirando el perfil de mi script, de hecho, bloquear es el más caro.
Dado que la ejecución de cada función es muy corta, la compensación entre bloquear cada vez que mapeo la función y ejecutar la función no vale la pena (de hecho, obtengo un mejor rendimiento ejecutándola en serie; 15 minutos en paralelo frente a 4.5 minutos de serie).
La función escribe en archivos independientes, por lo que las llamadas son completamente independientes. ¿Es posible 'imitar' ejecutar / llamar al mismo script de Python paralelizado varias veces (con diferentes entradas) para hacer más uso de la CPU?
Código actual:
pool = Pool(cpu_count(), initializer=tqdm.tqdm.set_lock, initargs=(Lock(),))
for _ in tqdm.tqdm(pool.imap_unordered(parallel_process, pubfiles, chunksize=70), total=nfiles, desc='Parsing files'):
pass
EDITAR:
Para asegurarse de que no tenga nada que ver con el bloqueo de tqdm, modificar el código a lo siguiente logra el mismo problema:
pool = Pool(cpu_count())
for i in pool.imap_unordered(parallel_process, files, chunksize=70):
print(i)
He perfilado mi código durante un tiempo y los procesos más costosos parecen estar relacionados con el bloqueo (?) / Multiprocesamiento en general. La función real está muy cerca del final del tiempo de procesamiento.
Este problema no tenía nada que ver con el multiprocesamiento: mis funciones estaban vinculadas a IO porque cada llamada estaba leyendo y escribiendo un archivo en el disco y esto era un cuello de botella cuando se ejecutaba en paralelo. La fragmentación y la reducción del número de archivos escritos redujeron este cuello de botella y el código de multiprocesamiento anterior (paralelismo) funcionó perfectamente bien.
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras