2010-12-01 15 views
5

Estoy ejecutando un programa python de subproceso único que realiza un procesamiento de datos masivo en mi cuadro de Windows. Mi máquina tiene 8 procesadores. Cuando controlo el uso de la CPU en la pestaña de rendimiento en el Administrador de tareas de Windows, muestra que estoy usando solo una fracción muy pequeña de la potencia de procesamiento disponible para mí. Solo un procesador se está utilizando al máximo y el resto está casi inactivo. ¿Qué debo hacer para asegurarme de que se usen todos mis procesadores? ¿Multithreading es una solución?¿Cómo se programa usar todos los procesadores en su máquina?

+1

Sí, se requiere multihebra. – cspolton

+0

pero sin una descripción de su programa no podemos decir si o cómo –

+0

No se requiere multiprocesamiento. –

Respuesta

6

multihilo no puede hacer uso de procesadores o núcleos adicionales.

Debe generar nuevos procesos en lugar de nuevos subprocesos.

Esta herramienta es, con mucho, el más simple entre los animales que he encontrado: parallel python

general:

PP es un módulo de Python que proporciona mecanismo para ejecución paralela de código Python en SMP (sistemas con múltiples procesadores o núcleos ) y clusters (computadoras conectadas a través de la red).

Es ligero, fácil de instalar e integrar con otro software de python.

PP es un código abierto y el módulo multiplataforma escrito en Python puro

+1

He simplificado mi respuesta mucho. El contexto es, por supuesto, la codificación con Python, por lo que tiene las limitaciones que usted y otros han mencionado. – kakarukeys

+0

+1 por mencionar un procesamiento paralelo lib – invert

+0

@Forest: debe revisar http://us.pycon.org/2010/conference/schedule/event/76/ y luego reconsiderar la sabiduría común (por lo general errónea) de que algunos subprocesos puede ser eficiente incluso con el GIL. El GIL tiene algunos efectos prácticos realmente inusuales que desafían lo que te puedas imaginar que es la teoría. –

1

Suponiendo que su tarea es parallelizable, entonces sí, el enhebrado es sin duda una solución. En particular, si tiene muchos elementos de datos para procesar, pero todos pueden manejarse independientemente,, entonces debería ser relativamente fácil de paralelizar.

Usando múltiples procesos en lugar de múltiples hilos podría ser ser otra solución - no nos ha dicho lo suficiente sobre el problema para decirlo realmente.

+0

, de hecho, los procesos múltiples * son * la solución más genérica, ya que es posible que no se admita la difusión de varios subprocesos del mismo proceso en varios núcleos en una plataforma/sistema operativo determinado. – knitti

+0

@knitti: La pregunta es sobre Windows específicamente. Hay muchas veces en que el uso de procesos múltiples sería inconveniente hasta el punto de que los hilos no serían tan malos. –

+0

lo siento, obviamente debo perfeccionar mis habilidades de lectura ... pero por curiosidad: ¿por qué crees que múltiples procesos serían tan inconvenientes? – knitti

2

Se requiere multihebra para un solo proceso, pero no es necesariamente una solución; La afinidad del procesador puede restringirlo a un subconjunto de núcleos disponibles incluso si tiene hilos más que suficientes para usarlos todos.

+0

¿Realmente quiere decir "no es una solución" o "podría * no ser una solución"? ¿La afinidad del procesador * definitivamente * será un problema? –

+0

@Jon: Actualizado. –

+0

Genial, gracias. Tiene mucho más sentido. Me preguntaba si había alguna desventaja dentro de Python que pudiera causar problemas. –

2

usted puede conseguir que si su programa es del tipo que se beneficiarían usando python's multiprocessing module

multiprocesamiento utiliza múltiples procesos pitón que evita problemas con el GIL por lo que es posible utilizar todos los núcleos con código Python que tiene una mapa fácil roscado y la base de sistemas más complejos

es similar a paralelo pitón pero está limitado a la máquina local y se incluye con el pitón 2,6 y más alto y es metafóricamente similar al pitón de enhebrar

+0

Por favor expanda su respuesta. No entiendo lo que intentas decir. – invert

2

Como una adición a lo que Jon dijo, si estás usando el intérprete de Python estándar debe comprender las limitaciones con respecto a multi-threading. Si sus hilos son puros-python y no están haciendo llamadas al sistema, no pueden ejecutarse simultáneamente en múltiples procesadores debido al Global Interpreter Lock, por lo que los beneficios de la multi-threading son mínimos. En este caso, tal vez la recomendación sería ir con múltiples procesos en su lugar o cambiar a otra implementación de Python como JPython o IronPython, que no tienen un bloqueo de intérprete global.

1

hacer esto.

Divida su tarea en pasos o etapas. Cada paso lee algo, forma parte del cálculo general y escribe algo.

"""Some Step.""" 
import json 
for some_line in sys.stdin: 
    object= json.loads(some_line) 
    # process the object 
    json.dump(result, sys.stdout) 

Algo así debería funcionar bien.

Si tiene varios objetos que deben comunicarse, cree un diccionario simple de los objetos.

results = { 'a': a, 'b': b } 

los conectan en una tubería, como este.

python step1.py | python step2.py | python step3.py >output_file.dat 

Si puede dividir las cosas en 8 o más pasos, usará 8 o más núcleos. Y, por cierto, esto será increíblemente rápido para muy poco trabajo real.

Cuestiones relacionadas