2010-08-23 28 views
19

¿El enhebrado de python expone problemas de visibilidad de la memoria y reordenamiento de sentencias como lo hace Java? Como no puedo encontrar ninguna referencia a un "Modelo de memoria de Python" ni nada por el estilo, a pesar del hecho de que mucha gente está escribiendo código Python multiproceso, supongo que estos problemas no existen aquí. No palabra clave volátil, por ejemplo. Pero no parece expresarse explícitamente en ningún lado que, por ejemplo, un cambio en una variable en un hilo sea inmediatamente visible para todos los otros hilos.python threading: modelo de memoria y visibilidad

Tal vez esto es todo muy obvio para los programadores de Python, sino como un programador de Java temerosa, que requieren un poco de seguridad adicional :)

Respuesta

17

Hay no hay un modelo formal para el enhebrado de Python (hey, después de todo, no hubo uno para Java durante años ... con suerte, uno también se escribirá finalmente para Python).

En la práctica, ninguna implementación de Python realiza ninguna optimización avanzada como el reordenamiento de sentencias o el tratamiento temporal de variables compartidas como cadenas locales, y puede contar con estas restricciones semánticas aunque no estén formalmente aseguradas.

CPython en particular, como se menciona en @ Rawheiser, utiliza un bloqueo de intérprete global; otras implementaciones (PyPy, IronPython, Jython, ...) no (para que puedan usar múltiples núcleos de manera efectiva con un modelo de subprocesamiento, mientras que CPython requiere procesamiento múltiple para el mismo propósito), por lo que no debe contar con eso si lo desea para escribir código que sea portátil en todas las implementaciones de Python. (Por lo tanto, no debe contar con la "atomicidad" de las operaciones que solo son atómicas en CPython debido al GIL, como los accesos al diccionario: en otras implementaciones de Python, varios hilos pueden estar modificando un dicto de una vez y causar errores a menos que protejas el dict con un candado o similar).

+2

Incluso en CPython, el acceso al diccionario no es atómico en todas las circunstancias. Si las funciones hash/compare de las claves se escriben en Python, el GIL se liberará temporalmente entre los códigos de operación cuando esas funciones se estén ejecutando. (Probablemente ya sepas esto, pero creo que vale la pena señalar para otros lectores) –

+1

¡Gracias! Pasé toda mi mañana aprendiendo sobre el GIL. Obviamente (C) la programación de Python implicará una forma diferente de ver los hilos de lo que estoy acostumbrado. @Daniel Stutzbach: Soy nuevo en Python y habría pasado por alto ese hecho. Gracias. – philo

+3

@philo, que resume la situación de multitarea para CPython: los subprocesos lo ayudarán solo si tiene E/S espera (que puede delegar en un subproceso) o si realiza operaciones pesadas en una extensión de Python segura para subprocesos (como 'numpy '). Si su propósito es usar múltiples núcleos para operaciones codificadas por Python y CPU, use 'multiprocesamiento' en lugar de' subprocesamiento'. –

1
+0

¿Qué tiene esto que ver con la pregunta? – habnabit

+0

Esto significa que no hay tantas cosas de subprocesos múltiples de las que preocuparse, ya que solo un hilo de todo en el intérprete. –

+0

@KevinKostlan eso no es exactamente cierto. GIL permite que el código python puro se ejecute en un hilo a la vez. es un error común pensar que Python es un proceso de subproceso único, pero está usando subprocesos reales. eso significa, entonces, aunque un bloqueo global permite que solo un hilo funcione a la vez, de hecho es un argumento válido para cuestionar si la asignación a la memoria en un hilo se refleja en otros. Por cierto, las operaciones de E/S como socket.send y etc. obtienen un ticket gratis de GIL, lo que hace que varios hilos funcionen y funcionen juntos – RoeeK

Cuestiones relacionadas