Hilo de Python y GIL

Estaba leyendo sobre el GIL y nunca se especificó realmente si esto incluye el hilo principal o no (supongo que sí). La razón por la que pregunto es porque tengo un progtwig con una configuración de subprocesos que modifica un diccionario. El hilo principal agrega / elimina en función de la entrada del jugador, mientras que un hilo repite la actualización y el cambio de datos.

Sin embargo, en algunos casos, un hilo puede iterar sobre las claves del diccionario donde se podrían eliminar. Si hay una llamada GIL y se ejecutan de forma secuencial, ¿por qué recibo errores de cambio de dictado? Si solo se supone que uno debe ejecutarse a la vez, técnicamente esto no debería suceder.

¿Alguien puede arrojar algo de luz sobre tal cosa? Gracias.

Se ejecutan al mismo tiempo, simplemente no se ejecutan al mismo tiempo. Las iteraciones pueden ser intercaladas. Citar Python:

El mecanismo utilizado por el intérprete de CPython para asegurar que solo un hilo ejecute el código de bytes de Python a la vez.

Entonces, dos bucles for podrían ejecutarse al mismo tiempo, simplemente no habrá (por ejemplo) dos del dict[index] al mismo tiempo.

El GIL se bloquea en un nivel de código de byte de Python, y se aplica a todos los subprocesos, incluso el subproceso principal. Si tiene un hilo que modifica un diccionario y otro que itera las claves, interferirán entre sí.

“Sólo uno se ejecuta a la vez” es cierto, pero hay que entender la unidad de granularidad. En el caso de GIL de CPython, la granularidad es una instrucción de bytecode, por lo que la ejecución puede cambiar entre subprocesos en cualquier bytecode.

El gil evita que dos hilos modifiquen el estado del intérprete simultáneamente. No proporciona ninguna restricción de consistencia del hilo, ni ningún tipo de exclusión mutua en una granularidad más pequeña que todo el proceso. Si necesita leer y modificar un dict en dos subprocesos, debe usar un mutex

Python cambia los hilos más a menudo de lo que parece pensar que lo hace. Dice que “solo uno” debe ejecutarse a la vez, y técnicamente eso es cierto, pero depende de su definición de “uno”. Las operaciones atómicas de Python son muy pequeñas. Por ejemplo: agregar un solo elemento a un diccionario. La iteración sobre un diccionario completo puede ser interrumpida.

Debe usar un objeto de locking de la biblioteca de subprocesos para aislar las operaciones atómicas de su progtwig.