Cómo usar las extensiones C en python para moverte por GIL

Quiero ejecutar un progtwig intensivo de CPU en Python a través de múltiples núcleos y estoy tratando de averiguar cómo escribir extensiones C para hacer esto ¿Hay ejemplos de código o tutoriales sobre esto?

Ya puedes dividir un progtwig de Python en múltiples procesos. El sistema operativo ya asignará sus procesos a todos los núcleos.

Hacer esto.

python part1.py | python part2.py | python part3.py | ... etc. 

El sistema operativo asegurará que la parte utilice tantos recursos como sea posible. Puede pasar información de manera trivial a lo largo de este cPickle utilizando cPickle en sys.stdin y sys.stdout .

Sin demasiado trabajo, esto a menudo puede llevar a aceleraciones dramáticas.

Sí, para los haterz, es posible construir un algoritmo tan torturado que no se pueda acelerar mucho. Sin embargo, esto a menudo produce enormes beneficios para un trabajo mínimo.

Y.

La reestructuración para este propósito coincidirá exactamente con la reestructuración requerida para maximizar la concurrencia del hilo. Asi que. Comience con el paralelismo del proceso de “no compartir” hasta que pueda probar que compartir más datos sería útil, luego continúe con el paralelismo de subprocesos de todo lo más complejo.

Echa un vistazo a multiprocesamiento . Lo que prefieren los sistemas operativos es un hecho que a menudo se pasa por alto el hecho de que no se comparten datos globalmente, y no se agrupan cargas de hilos en un solo proceso.

Si aún insiste en que su comportamiento intensivo de CPU requiere subprocesos, consulte la documentación para trabajar con GIL en C. Es bastante informativo.

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

PD: quiero decir que si el procesamiento ya está en C, como el procesamiento de imágenes, liberar el locking en la extensión C es bueno. Si su código de procesamiento está principalmente en Python, la sugerencia de otras personas para el multiprocessing es mejor. Por lo general, no está justificado reescribir el código en C para el procesamiento en segundo plano.

¿Has considerado usar una de las bibliotecas mpi de python como mpi4py ? Aunque MPI se usa normalmente para distribuir el trabajo a través de un clúster, funciona bastante bien en una sola máquina multinúcleo. El inconveniente es que tendrá que refactorizar su código para usar las llamadas de comunicación de MPI (lo que puede ser fácil).

El multiprocesamiento es fácil. Si eso no es lo suficientemente rápido, tu pregunta es complicada.