I tiene algunas funciones que interactivamente cargar módulos Python usando __import__
de importación dentro de un hilo de Python
recientemente me topé con algún artículo sobre un "bloqueo de importación" en Python, es decir, una cerradura específicamente para las importaciones (no sólo el GIL). Pero el artículo era viejo, así que tal vez ya no sea así.
Esto me hace preguntarme sobre la práctica de importar en un hilo.
- Son
import
/__import__
thread safe? - ¿Pueden crear bloqueos muertos?
- ¿Pueden causar problemas de rendimiento en una aplicación con subprocesos?
EDITAR 12 de septiembre de 2012
Gracias por la gran respuesta Soravux. Así que la importación es segura para subprocesos, y no me preocupo por los interbloqueos, ya que las funciones que usan __import__
en mi código no se llaman entre sí.
¿Sabe si el bloqueo se adquiere incluso si el módulo ya se ha importado? Si ese es el caso, probablemente debería buscar en sys.modules para verificar si el módulo ya ha sido importado antes de hacer una llamada al __import__
.
Claro, esto no debería marcar una gran diferencia en CPython ya que de todos modos hay GIL. Sin embargo, podría hacer una gran diferencia en otras implementaciones como Jython o python sin apilamiento.
EDITAR 19 de Sept 2012
Sobre Jython, aquí está lo que se dice en el documento:
http://www.jython.org/jythonbook/en/1.0/Concurrency.html#module-import-lock
Python hace, sin embargo, definir un bloqueo de importación de módulo, que es implementado por Jython. Este bloqueo se adquiere cada vez que se realiza una importación de cualquier nombre . Esto es así independientemente de si la importación pasa por la instrucción import , el equivalente
__import__
incorporado o código relacionado. Es importante tener en cuenta que incluso si el módulo correspondiente ya se ha importado , el bloqueo de importación del módulo seguirá adquiriéndose, si solo brevemente.
Por lo tanto, parece que tendría sentido comprobar sys.modules antes de realizar una importación, para evitar adquirir el bloqueo. ¿Qué piensas?
Imagino que son seguros para subprocesos, ya que como dices, el intérprete bloquea las importaciones. Me interesaría averiguar si podrían causar interbloqueos de una forma distinta a las importaciones circulares típicas sin rosca. –