を使用してPythonモジュールをインタラクティブにロードする関数がいくつかあります__import__
最近、Python の「インポート ロック」、つまり (GIL だけでなく) インポート専用のロックに関する記事を見つけました。しかし、記事が古いので、それはもう真実ではないかもしれません。
これは、スレッドでのインポートの慣行について疑問に思います。
import
/は__import__
スレッドセーフですか?- デッドロックを作成できますか?
- スレッド化されたアプリケーションでパフォーマンスの問題を引き起こす可能性はありますか?
2012年9月12日編集
Soravux さん、すばらしい回答をありがとうございます。__import__
したがって、インポートはスレッド セーフであり、コードで使用する関数が互いに呼び出されないため、デッドロックについて心配する必要はありません。
モジュールが既にインポートされている場合でも、ロックが取得されているかどうか知っていますか? その場合は、sys.modules を調べて、モジュールを呼び出す前にモジュールが既にインポートされているかどうかを確認する必要があります__import__
。
とにかくGILがあるので、これはCPythonに大きな違いをもたらさないはずです。ただし、Jython やスタックレス python などの他の実装では大きな違いが生じる可能性があります。
2012年9月19日編集
Jythonについては、ドキュメントで次のように述べています。
http://www.jython.org/jythonbook/en/1.0/Concurrency.html#module-import-lock
ただし、Python は、Jython によって実装されるモジュール インポート ロックを定義します。このロックは、任意の名前のインポートが行われるたびに取得されます。これは、インポートが import ステートメント、同等の
__import__
ビルトイン、または関連するコードを通過するかどうかに関係なく当てはまります。対応するモジュールが既にインポートされている場合でも、モジュールのインポート ロックは、短時間だけでも取得されることに注意することが重要です。
したがって、ロックの取得を避けるために、インポートを行う前に sys.modules をチェックインすることは理にかなっているようです。どう思いますか?