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?
Respuesta
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
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
+1 por mencionar un procesamiento paralelo lib – invert
@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. –
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.
, 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
@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. –
lo siento, obviamente debo perfeccionar mis habilidades de lectura ... pero por curiosidad: ¿por qué crees que múltiples procesos serían tan inconvenientes? – knitti
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.
¿Realmente quiere decir "no es una solución" o "podría * no ser una solución"? ¿La afinidad del procesador * definitivamente * será un problema? –
@Jon: Actualizado. –
Genial, gracias. Tiene mucho más sentido. Me preguntaba si había alguna desventaja dentro de Python que pudiera causar problemas. –
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
Por favor expanda su respuesta. No entiendo lo que intentas decir. – invert
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.
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.
- 1. ¿Python usará todos los procesadores en el modo de subprocesos?
- 2. ¿Cómo hacer que R use todos los procesadores?
- 3. Cómo cambiar los procesadores en matplotlib/Python
- 4. cómo arrancan los procesadores multinúcleo?
- 5. Cómo encontrar todos los navegadores instalados en una máquina
- 6. ¿Cómo instalar atajos de programa para todos los usuarios?
- 7. ¿Por qué usar Unicode si su programa es solo inglés?
- 8. ¿Cómo usar todos los núcleos en Windows 7?
- 9. ¿Cómo puedo modificar mi script Perl para usar múltiples procesadores?
- 10. ¿Cómo puedo paralelizar un algoritmo en una máquina con múltiples procesadores?
- 11. ¿Cómo suspender todos los hilos después de que se cuelgue mi programa?
- 12. Consejos para hacer * Todos * ¿Su trabajo en una sola máquina virtual?
- 13. ¿Cómo obtener la dirección MAC de su máquina usando un programa C?
- 14. ¿Vallin/Valgrind puede usar múltiples procesadores?
- 15. cómo cargar todos los ensamblados desde su directorio/bin
- 16. ¿Cómo se puede ejecutar un programa compilado en el lenguaje de máquina en diferentes máquinas?
- 17. ¿Cómo puedo usar HTML5 en todos los navegadores, incluido IE7,8?
- 18. ¿Pueden los procesadores XSLT tener múltiples subprocesos?
- 19. Cómo usar la reflexión para crear una "máquina de reflexión"
- 20. Secciones críticas con procesadores multinúcleo
- 21. ¿Cómo puedo forzar que todos los subprocesos de programa salgan al cerrar el programa?
- 22. ¿Cómo ejecutar un programa y conocer su PID en Linux?
- 23. MPI: ¿núcleos o procesadores?
- 24. Procesadores de recuento usando C++ en Windows
- 25. ¿Mejores prácticas para el cronómetro en la máquina de múltiples procesadores?
- 26. Significado del programa en su idioma y programa en su idioma
- 27. ¿Cómo configurar matlabpool para múltiples procesadores?
- 28. OpenMPI: Todos los nodos se ejecutan como nodo 0
- 29. Invocar mediante programación los procesadores de anotación
- 30. Tarjetas de video basadas en GPU para acelerar los cálculos de su programa, ¿Cómo?
Sí, se requiere multihebra. – cspolton
pero sin una descripción de su programa no podemos decir si o cómo –
No se requiere multiprocesamiento. –