У меня есть некоторые функции, которые интерактивно загружают модули python с помощью __import__
Недавно я наткнулся на статью о "блокировке импорта" на Python, то есть блокировку специально для импорта (а не только для GIL). Но статья была старой, поэтому, возможно, это не так.
Это заставляет меня задуматься о практике импорта в потоке.
- Безопасны ли потоки
import
/__import__
? - Могут ли они создавать мертвые блокировки?
- Могут ли они вызывать проблемы с производительностью в поточном приложении?
РЕДАКТИРОВАТЬ 12 сентября 2012 г.
Спасибо за отличный ответ Soravux.
Поэтому импорт является потокобезопасным, и я не беспокоюсь о взаимоблокировках, так как функции, которые используют __import__
в моем коде, не называют друг друга.
Знаете ли вы, что блокировка получена, даже если модуль уже импортирован?
Если это так, я должен, вероятно, посмотреть в sys.modules, чтобы проверить, был ли модуль уже импортирован, прежде чем делать вызов __import__
.
Конечно, это не должно иметь большого значения в CPython, так как в любом случае есть GIL. Однако это может иметь большое значение для других реализаций, таких как Jython или stackless python.
РЕДАКТИРОВАТЬ 19 сентября 2012 г.
О Jython, вот что они говорят в документе:
http://www.jython.org/jythonbook/en/1.0/Concurrency.html#module-import-lock
Python, однако, определяет блокировку импорта модуля, которая реализованный Jython. Эта блокировка приобретается всякий раз, когда импорт любого имя изготовлен. Это верно, идет ли импорт через импорт оператор, эквивалентный
__import__
встроенный или связанный код. это важно отметить, что даже если соответствующий модуль уже были импортированы, блокировка импорта модуля все равно будет получена, если только кратко.
Итак, кажется, что было бы целесообразно проверить sys.modules перед импортом, чтобы избежать приобретения блокировки. Как вы думаете?