Quiero ejecutar un programa intensivo de CPU en Python en varios núcleos y estoy tratando de encontrar la manera de escribir extensiones C para hacerlo. ¿Hay ejemplos de código o tutoriales sobre esto?Cómo usar extensiones C en python para evitar GIL
Respuesta
¿Ha considerado utilizar una de las bibliotecas python mpi como mpi4py? Aunque MPI se usa normalmente para distribuir trabajo en un clúster, funciona bastante bien en una sola máquina multinúcleo. La desventaja es que tendrá que refactorizar su código para usar las llamadas de comunicación de MPI (lo cual puede ser fácil).
Eche un vistazo a multiprocessing. Es un hecho que a menudo se pasa por alto que no compartir datos de manera global, y no meter montones de hilos en un solo proceso es lo que prefieren los sistemas operativos.
Si aún insiste en que su comportamiento intensivo de CPU requiere enhebrar, consulte la documentación para working with the GIL in C. Es bastante informativo.
Ya puede dividir un programa de Python en múltiples procesos. El sistema operativo ya asignará sus procesos en todos los núcleos.
Haga esto.
python part1.py | python part2.py | python part3.py | ... etc.
El sistema operativo se asegurará de que la pieza utilice tantos recursos como sea posible. Puede pasar información trivialmente a lo largo de esta tubería utilizando cPickle
en sys.stdin
y sys.stdout
.
Sin demasiado trabajo, esto a menudo puede conducir a aceleraciones dramáticas.
Sí, hasta el haterz, es posible construir un algoritmo tan torturado que no se acelere demasiado. Sin embargo, esto a menudo rinde enormes beneficios por un trabajo mínimo.
Y.
La reestructuración para este propósito será exactamente coincidir con la reestructuración necesaria para maximizar la concurrencia de subprocesos. Asi que. Comience con el paralelismo de procesos de nada compartido hasta que pueda probar que compartir más información ayudaría, luego pase al paralelismo de hilos compartidos más complejo.
Este es un buen uso de la extensión C. La palabra clave que debe buscar es Py_BEGIN_ALLOW_THREADS
.
http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock
P. S. Quiero decir, si su procesamiento ya está en C, como el procesamiento de imágenes, luego suelte el bloqueo en la extensión C es bueno. Si su código de procesamiento está principalmente en Python, la sugerencia de otras personas para multiprocessing
es mejor. Por lo general, no es justificado reescribir el código en C para procesar el fondo.
multiprocesamiento es fácil. si eso no es lo suficientemente rápido, tu pregunta es complicada.
- 1. ¿Cómo puedo usar valgrind con las extensiones de Python C++?
- 2. Perfilando extensiones python C
- 3. Extensiones Python y OpenMP C
- 4. ¿Cómo supera un servidor web python GIL
- 5. Liberando Python GIL mientras estaba en el código C++
- 6. Enlazado de Python y GIL
- 7. python para extensiones de Firefox?
- 8. Cómo evitar la advertencia gcc en extensión de Python C cuando se utiliza Py_BEGIN_ALLOW_THREADS
- 9. depuración extensiones para Python swig
- 10. Docstrings en C extensiones a Python?
- 11. Establecer el compilador C/C++ para las extensiones de Python
- 12. ¿El Python GIL es realmente por intérprete?
- 13. Extensiones/módulos anidados de Python C?
- 14. ¿Cómo se compilan las extensiones Python C/C++ para diferentes sistemas operativos/versiones de Python?
- 15. Extensiones de velocidad de Python en C contra C
- 16. ¿Cuál es la versión del GIL de C#?
- 17. ¿La ejecución de procesos python separados evita el GIL?
- 18. Concurrencia: ¿Las extensiones de Python escritas en C/C++ están afectadas por el bloqueo de intérprete global?
- 19. Creando extensiones C de Python de 64 bits en Windows
- 20. ¿Extensiones extendidas en C++?
- 21. ¿Cómo puedo usar .htaccess para ocultar extensiones de URL .php?
- 22. ¿Cómo usar Winmerge con extensiones de Git?
- 23. Cómo usar HTML5 WebSockets para extensiones de Chrome
- 24. ¿Puedo usar Python para desarrollar extensiones para todos los principales navegadores?
- 25. SQLAlchemy con Python 3.2: ¿las extensiones C no son compatibles?
- 26. ¿Puede CUDA usar extensiones SIMD?
- 27. deepcopy and python - consejos para evitar usarlo?
- 28. Creando/probando un proyecto Python con extensiones C
- 29. Usar el código Python en C/C++
- 30. ¿Es posible usar extensiones PECL en HipHop?
El mayor problema que encontré al tratar de usar multiprocesamiento vs subprocesamiento es que al intentar ejecutar más de 1000 subprocesos (procesos) es que se obtiene una instancia separada del intérprete de Python con cada uno. Esto se vuelve extremadamente caro en términos de memoria. – Andy
@nalroff: Eso no suena bien. La memoria utilizada para la mayoría del intérprete es compartida por todas las instancias de ese intérprete. Solo las páginas que difieren aumentarán el uso total de la memoria. Asegúrese de estar buscando el valor correcto.También vale la pena señalar que los procesos no usan mucha más memoria que los subprocesos adicionales. –
En cada instancia que he usado el módulo de multiprocesamiento en Python, siempre he visto una diferencia dramática en el uso de la memoria entre los procesos y los hilos. De todos modos, el módulo de subprocesamiento parece ser lo suficientemente rápido para raspar web con hilos y pruebas de rendimiento de una aplicación web, que es todo lo que estoy usando para todos modos. – Andy