set_start_method - starmap python multiprocessing
Python utiliza mĂșltiples procesadores (5)
Acerca de las implementaciones de cola. Hay algunos.
Mire el proyecto de Apio. http://celeryproject.org/
Entonces, en su caso, puede ejecutar 12 conversiones (una en cada CPU) como tareas de Apio, agregar una función de devolución de llamada (a la conversión oa la tarea) y en esa función de devolución de llamada agregar una nueva tarea de conversión ejecutándose cuando una de las anteriores conversiones ha terminado.
Digamos que tengo una gran lista de música de diferente duración que necesita ser convertida o imágenes de diferentes tamaños que necesitan cambiar de tamaño o algo así. El orden no importa, por lo que es perfecto para dividir en varios procesadores.
Si utilizo la función de mapa multiprocesamiento.Pool, parece que todo el trabajo está dividido por adelantado y no tiene en cuenta el hecho de que algunos archivos pueden tardar más tiempo en hacer que los demás.
Lo que sucede es que si tengo 12 procesadores ... cerca del final del proceso, 1 o 2 procesadores tendrán que procesar 2 o 3 archivos, mientras que otros procesadores que podrían utilizarse permanecerán inactivos.
¿Hay algún tipo de implementación de cola que pueda mantener todos los procesadores cargados hasta que no quede más trabajo por hacer?
La biblioteca de threading de Python que más me ha alegrado es Parallel Python (PP) . Es trivial con PP utilizar un enfoque de grupo de subprocesos con una única cola para lograr lo que necesita.
Hay una clase Queue
dentro del módulo de multiprocessing
específicamente para este propósito.
Editar: si está buscando un marco completo para la computación paralela que cuenta con una función de map()
utilizando una cola de tareas, eche un vistazo a las instalaciones de computación paralela de IPython . En particular, puede usar la función TaskClient.map()
para obtener una asignación equilibrada de carga a los procesadores disponibles.
Este no es el caso si usa Pool.imap_unordered
.
Esto es trivial para hacer con jarra :
def process_image(img):
....
images = glob(''*.jpg'')
for im in images:
Task(process_image, im)
Ahora, ejecute jug execute
varias veces para generar procesos de trabajo.