pyplot - plot title python



¿Por qué una tarea enlazada de E/S de Python no está bloqueada por la GIL? (2)

La GIL en CPython 1 solo se ocupa de la ejecución del código Python. Una extensión C segura para subprocesos que utiliza una gran cantidad de CPU podría liberar GIL siempre que no necesite interactuar con el tiempo de ejecución de Python.

Tan pronto como el código C necesita 'hablar' con Python (lea: volver a llamar al tiempo de ejecución de Python), entonces debe adquirir el GIL nuevamente, es decir, el GIL debe establecer un comportamiento de protección / atómico para el "intérprete" ( y uso el término a la ligera) y no es para evitar que el código nativo / no Python se ejecute simultáneamente.

Liberar el GIL alrededor de la E / S (bloquear o no, usar CPU o no) es lo mismo: hasta que los datos se transfieran a Python, no hay razón para adquirir el GIL.

1 La GIL es controvertida porque impide que los programas de multiproceso de CPython aprovechen al máximo los sistemas multiprocesador en ciertas situaciones. Tenga en cuenta que las operaciones de bloqueo o de larga ejecución, como la E / S, el procesamiento de imágenes y el procesamiento de números NumPy, ocurren fuera de la GIL. Por lo tanto , es solo en programas de multiproceso que pasan mucho tiempo dentro de la GIL, interpretando el código de byte de CPython , que la GIL se convierte en un cuello de botella.

https://src-bin.com

La documentación de subprocesos de Python indica que "... los subprocesos siguen siendo un modelo adecuado si desea ejecutar varias tareas enlazadas a E / S simultáneamente", aparentemente porque los procesos vinculados a E / S pueden evitar el GIL que evita que los subprocesos se ejecuten simultáneamente. Tareas vinculadas a la CPU.

Pero lo que no entiendo es que una tarea de E / S todavía usa la CPU. Entonces, ¿cómo no podría encontrar los mismos problemas? ¿Es porque la tarea enlazada de E / S no requiere administración de memoria?


Answer #1

Todas las primitivas de E / S de bloqueo de Python liberan la GIL mientras esperan que se resuelva el bloqueo de E / S. ¡Es tan simple como eso! Por supuesto, necesitarán adquirir el GIL nuevamente antes de continuar ejecutando más código Python, pero para los intervalos de ciclos de máquina largos en los que solo están esperando un syscall de E / S, no lo hacen. No necesito el GIL, ¡así que no lo retienen!





multithreading