импорт внутри потока Python
У меня есть некоторые функции, которые в интерактивном режиме загружают модули Python, используя__import__
Недавно я наткнулся на статью о блокировке импорта. в Python, то есть блокировка специально для импорта (не только GIL). Но статья была старой, так что, может быть, это больше не так.
Это заставляет меня задуматься о практике импорта в потоке.
Areimport
/__import__
thread safe?
Can they create dead locks?
Can they cause performance issues in a threaded application?
РЕДАКТИРОВАТЬ 12 сентября 2012
Спасибо за отличный ответ Soravux.
Таким образом, импорт является поточно-ориентированным, и я не беспокоюсь о взаимоблокировках, так как функции, которые используют__import__
в моем коде не звоните друг другу.
Знаете ли вы, получена ли блокировка, даже если модуль уже был импортирован?
Если это так, я, вероятно, должен заглянуть в sys.modules, чтобы проверить, был ли модуль уже импортирован, прежде чем делать вызов__import__
.
Конечно, это не должно иметь большого значения в CPython, так как в любом случае есть GIL. Однако это может иметь большое значение для других реализаций, таких как Jython или Python без стеков.
РЕДАКТИРОВАТЬ 19 сентября 2012
О Jython, вот что они говорят в документе:
http://www.jython.org/jythonbook/en/1.0/Concurrency.html#module-import-lock
Python does, however, define a module import lock, which is
implemented by Jython. This lock is acquired whenever an import of any
name is made. This is true whether the import goes through the import
statement, the equivalent __import__
builtin, or related code. It’s
important to note that even if the corresponding module has already
been imported, the module import lock will still be acquired, if only
briefly.
Таким образом, кажется, что имеет смысл проверить sys.modules перед выполнением импорта, чтобы избежать блокировки. Как вы думаете?