programar - ¿Python es compatible con multihilo? ¿Puede acelerar el tiempo de ejecución?
programacion en paralelo python (2)
El GIL no evita el enhebrado. Todo lo que GIL hace es asegurarse de que solo un hilo esté ejecutando código Python a la vez; el control todavía cambia entre hilos.
Lo que el GIL impide en ese momento es utilizar más de un núcleo de CPU o CPU separadas para ejecutar subprocesos en paralelo.
Esto solo se aplica al código de Python. Las extensiones C pueden liberar y liberan el GIL para permitir que múltiples hilos de código C y un hilo de Python se ejecuten en múltiples núcleos. Esto se extiende a las E / S controladas por el núcleo, como las llamadas select()
para lecturas y escrituras de socket, lo que hace que Python maneje los eventos de red de manera razonablemente eficiente en una configuración multi-hilos multi-core.
Lo que muchas implementaciones de servidores hacen, es ejecutar más de un proceso de Python, para permitir que el sistema operativo maneje la programación entre procesos para utilizar sus núcleos de CPU al máximo. También puede usar la biblioteca de multiprocessing
para manejar el procesamiento paralelo en múltiples procesos desde una base de código y un proceso principal, si eso se adecua a sus casos de uso.
Tenga en cuenta que el GIL solo se aplica a la implementación de CPython; Jython e IronPython utilizan una implementación de subprocesamiento diferente (los subprocesos de tiempo de ejecución comunes Java VM y .NET respectivamente).
Para abordar su actualización directamente: cualquier tarea que intente obtener un aumento de velocidad a partir de la ejecución paralela, utilizando el código de Python puro, no verá una aceleración ya que el código de Python con hebras está bloqueado en un subproceso que se ejecuta a la vez. Sin embargo, si mezcla extensiones C y E / S (como las operaciones PIL o numpy) y cualquier código C se puede ejecutar en paralelo con un hilo de Python activo.
El subprocesamiento de Python es ideal para crear una GUI receptiva o para manejar múltiples solicitudes de web cortas en las que la E / S es el cuello de botella más que el código de Python. No es adecuado para paralelizar código de Python computacionalmente intensivo, se adhiere al módulo de multiprocessing
para tales tareas o se delega a una biblioteca externa dedicada.
Estoy un poco confundido acerca de si multithreading funciona en Python o no.
Sé que ha habido muchas preguntas al respecto y he leído muchas de ellas, pero todavía estoy confundido. Sé por mi propia experiencia y he visto a otros publicar sus propias respuestas y ejemplos aquí en StackOverflow de que el multihilo es de hecho posible en Python. Entonces, ¿por qué todos siguen diciendo que Python está bloqueado por el GIL y que solo se puede ejecutar un hilo a la vez? Claramente funciona ¿O hay alguna distinción que no estoy recibiendo aquí?
Muchos carteles / encuestados también siguen mencionando que el enhebrado es limitado porque no utiliza múltiples núcleos. Pero diría que siguen siendo útiles porque funcionan simultáneamente y, por lo tanto, hacen que la carga de trabajo combinada sea más rápida. Quiero decir, ¿por qué habría incluso un módulo de subprocesos de Python?
Actualizar:
Gracias por todas las respuestas hasta el momento. La forma en que lo entiendo es que el multihebra solo se ejecutará en paralelo para algunas tareas de IO, pero solo se puede ejecutar de una en una para tareas múltiples de CPU.
No estoy del todo seguro de lo que esto significa para mí en términos prácticos, así que solo daré un ejemplo del tipo de tarea que me gustaría realizar en múltiples intentos. Por ejemplo, digamos que quiero recorrer una larga lista de cadenas y quiero hacer algunas operaciones básicas de cadena en cada elemento de la lista. Si separé la lista, enviaré cada sublista para ser procesada por mi código de bucle / cadena en una nueva secuencia, y enviaré los resultados nuevamente a la cola, ¿estas cargas de trabajo se ejecutarán aproximadamente al mismo tiempo? Lo que es más importante, ¿teóricamente esto acelerará el tiempo necesario para ejecutar el script?
Otro ejemplo podría ser si puedo renderizar y guardar cuatro imágenes diferentes usando PIL en cuatro hilos diferentes, y ¿esto es más rápido que procesar las imágenes una detrás de otra? Supongo que este componente de velocidad es lo que realmente me pregunto en lugar de cuál es la terminología correcta.
También sé sobre el módulo de multiprocesamiento, pero mi principal interés ahora es para cargas de tareas pequeñas a medianas (10-30 segundos) y, por lo tanto, creo que el subprocesamiento múltiple será más apropiado porque los procesos secundarios pueden tardar en iniciarse.
Sí. :)
Tiene el módulo de thread bajo nivel y el módulo de threading nivel superior. Pero si simplemente desea utilizar máquinas multinúcleo, el módulo de multiprocessing es el camino a seguir.
Cita de los docs :
En CPython, debido al bloqueo de Intérprete global, solo un hilo puede ejecutar el código de Python a la vez (aunque ciertas bibliotecas orientadas al rendimiento podrían superar esta limitación). Si desea que su aplicación haga un mejor uso de los recursos computacionales de las máquinas multi-core, se le recomienda usar multiprocesamiento. Sin embargo, el enhebrado sigue siendo un modelo apropiado si desea ejecutar múltiples tareas vinculadas a E / S simultáneamente.