python - threads - ¿Las listas son seguras para hilos?
python thread wait example (3)
Las listas mismas son seguras para hilos. En CPython, el GIL protege contra los accesos concurrentes a ellos, y otras implementaciones se encargan de utilizar un bloqueo de grano fino o un tipo de datos sincronizado para sus implementaciones de listas. Sin embargo, aunque las listas en sí mismas no pueden dañarse al intentar acceder simultáneamente, los datos de la lista no están protegidos. Por ejemplo:
L[0] += 1
no se garantiza que realmente aumente L [0] en uno si otro hilo hace lo mismo, porque +=
no es una operación atómica. (Muy, muy pocas operaciones en Python son en realidad atómicas, porque la mayoría de ellas pueden causar que se llame código Python arbitrario). Debe usar Colas porque si solo usa una lista desprotegida, puede obtener o eliminar el elemento incorrecto debido a la raza condiciones
Observé que a menudo se sugiere utilizar colas con varios subprocesos, en lugar de listas y .pop()
. ¿Esto se debe a que las listas no son seguras para subprocesos o por alguna otra razón?
Para aclarar un punto en la excelente respuesta de Thomas, se debe mencionar que append()
es seguro para subprocesos.
Esto se debe a que no existe la preocupación de que los datos que se lean estarán en el mismo lugar una vez que vayamos a escribirlos . La operación append()
no lee datos, solo escribe datos en la lista.
Aquí hay una lista exhaustiva pero no exhaustiva de ejemplos de operaciones de list
y si son o no seguras para subprocesos. Esperando obtener una respuesta sobre el obj in a_list
construcción de lenguaje de lista here .