¿Cuándo son rápidos los hilos de Python?

Todos somos conscientes de los horrores de la GIL , y he visto mucha discusión sobre el momento adecuado para usar el módulo de multiprocessing , pero todavía no siento que tenga una buena intuición sobre cómo enhebrar en Python ( Centrarse principalmente en CPython) es la respuesta correcta.

¿En qué casos la GIL no es un cuello de botella significativo? ¿Cuáles son los tipos de casos de uso donde el subproceso es la respuesta más adecuada?

En realidad, el subprocesamiento solo tiene sentido si tiene muchos lockings de I / O en curso. Si ese es el caso, entonces algunos subprocesos pueden dormir mientras que otros subprocesos funcionan. Si los subprocesos están vinculados a la CPU, no es probable que veas mucho beneficio de los subprocesos múltiples.

Tenga en cuenta que el módulo de multiprocesamiento , aunque es más difícil de codificar, hace uso de procesos separados y, por lo tanto, no sufre los inconvenientes de la GIL.

Ya que parece que estás buscando ejemplos, aquí hay algunos que están fuera de mi cabeza y que obtuve de la búsqueda de ejemplos vinculados a CPU y E / S (parece que no puedo encontrar muchos). No soy un experto, así que siéntase libre de corregir cualquier cosa que haya clasificado incorrectamente. También vale la pena señalar que el avance de la tecnología podría mover un problema de una categoría a otra.

Tareas enlazadas de la CPU (uso multiprocessing )

  • Métodos numéricos / aproximaciones para funciones matemáticas (cálculo de dígitos de pi, etc.)
  • Procesamiento de imágenes
  • Realizando circunvoluciones
  • Cálculo de transformaciones para la progtwigción de gráficos (posiblemente manejado por GPU)
  • Compresión / descompresión de audio / video

Tareas enlazadas de E / S (el threading es probablemente correcto)

  • Envío de datos a través de una red
  • Escribir en / leer desde el disco
  • Preguntando por la entrada del usuario
  • Transmisión de audio / video

El GIL evita que Python ejecute múltiples hilos.

Si su código libera el GIL antes de saltar a una extensión C, otros hilos de python pueden continuar mientras se ejecuta el código C. Como con el locking de IO, que otras personas han mencionado.

Ctypes hace esto automáticamente , y también lo hace numpy . Por lo tanto, si su código los usa mucho, es posible que GIL no lo restrinja significativamente.

Además de las tareas vinculadas a la CPU y las vinculadas a la E / S, hay más casos de uso. Por ejemplo, el hilo habilita tareas concurrentes . Una gran cantidad de progtwigción GUI entran en esta categoría. El bucle principal debe responder a los eventos del mouse. Entonces, cada vez que tienes una tarea que lleva un tiempo y no quieres congelar la interfaz de usuario, lo haces en un hilo separado. Es menos sobre el rendimiento y más sobre el paralelismo.