8

私はPythonバージョン2.7に取り組んでいます。C で記述された Python 用のモジュール拡張があります。モジュール初期化関数PyMODINIT_FUNC initmymoduleには、OpenSSL ライブラリを初期化するためのコードが含まれています。私のモジュールは共有ライブラリとして構築され、経由でロードされますimp.load_dynamic

このモジュールは何度もロードされる可能性があり、制御できません。Django と python がそれを行っています。そして、2回ロードすると、OPENSSL_config関数呼び出しも2回になります。そして、それはプロセスのクラッシュにつながります。

C コードからは制御できません。Python コードからも制御できません。

ここでドキュメントを見てください http://docs.python.org/2.7/library/imp.html それは言います:

imp.load_dynamic 動的にロード可能な共有ライブラリとして実装されたモジュールをロードして初期化し、そのモジュール オブジェクトを返します。モジュールがすでに初期化されている場合は、再度初期化されます。

良い。

Python バージョン 3.4 で同様の問題が解決されていることがわかりました http://hg.python.org/cpython/file/ad51ed93377c/Python/import.c#l459

複数の初期化をサポートするモジュールは、m_size フィールドを非負の数に設定します (モジュール固有の状態のサイズを示します)。共有ライブラリを 2 回ロードすることを避けるために、それらは引き続き拡張ディクショナリに記録されます。

しかし、Python 2.7 ではどうすればよいのでしょうか?

4

2 に答える 2

0

問題の原因が見つかりました。これは、django アプリケーションがドライバーを使用して PostgreSQL に接続し、このドライバーが OpenSSL ライブラリをロードするために発生します。user315052がこのコメントで示したように、競合につながります

アプリケーションのすべての暗号化機能を別のプロセスに移す必要があると思います。

于 2013-05-21T20:01:51.647 に答える