2011-01-20 11 views
6

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

Sin embargo, en algunos casos, un hilo puede iterar sobre las teclas del diccionario donde podría eliminarlas. Si hay un llamado GIL y se ejecutan de forma secuencial, ¿por qué estoy recibiendo errores modificados? Si se supone que solo uno se ejecutará a la vez, entonces técnicamente esto no debería suceder.

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

+2

En general, el subproceso de Python solo tiene sentido para los subprocesos vinculados a E/S. Si quiere que la coherencia acceda a las estructuras de datos en paralelo, necesita un bloqueo explícito. Si necesita un paralelismo con CPU, generalmente debe usar algo completamente diferente. – 9000

Respuesta

4

GIL se bloquea en un nivel de código de byte de Python, y se aplica a todos los hilos, incluso al hilo principal. Si tiene un hilo que modifica un diccionario y otras teclas que se repiten, interferirán entre sí.

"Solo una carrera a la vez" es cierto, pero debe comprender la unidad de granularidad. En el caso de GIL de CPython, la granularidad es una instrucción bytecode, por lo que la ejecución puede alternar entre subprocesos en cualquier bytecode.

+0

de la página de glosario de Python 'GIL El mecanismo utilizado por el intérprete de CPython para garantizar que solo un subproceso ejecute el bytecode de Python a la vez. Esto simplifica la implementación de CPython al hacer que el modelo de objetos (incluidos los tipos críticos incorporados, como dict) sea implícitamente seguro frente al acceso simultáneo. "Si no estoy equivocado, ¿esto significa que dict es seguro para subprocesos? – boh

+1

Depende de las operaciones que realice en el dict. Esto no es seguro para subprocesos: 'd [k] + = 1'. En caso de duda, use su propia sincronización. –

10

Son ejecutando al mismo tiempo, simplemente no ejecutan al mismo tiempo. Las iteraciones pueden estar intercaladas. Cita Python:

El mecanismo utilizado por el intérprete CPython para asegurar que sólo un hilo realiza Python bytecode a la vez.

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

+0

Ah gracias, esto tiene sentido para mí. – Charles

+1

Entonces debes marcar la respuesta como aceptada :) –

3

El gil evita que dos hilos modifiquen el estado del intérprete simultáneamente. No proporciona ninguna restricción de coherencia de subprocesos 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

1

Python cambia de tema más a menudo de lo que parece pensar que lo hace. Usted dice que se supone 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 se puede interrumpir.

Debe usar un objeto de bloqueo de la biblioteca threading para aislar las operaciones atómicas de su programa.

Cuestiones relacionadas