2009-07-12 11 views
3

「すべてがオブジェクトです」というこの考え方では、スレッド安全性はどこですか?静的メソッドとスレッドの安全性

私はwsgiでdjangoのウェブサイトを開発しています。また、それはlinuxでうまくいくでしょう。私が知っているように、彼らは効果的なプロセス管理を使用しているので、スレッドセーフについては考えられませんでした。私はモジュールがどのように読み込まれているのか疑問に思っていません。あらゆる情報が役に立つでしょう。

答えて

8

モジュール内の関数は、クラス内の静的メソッドと同等です。スレッドの安全性の問題は、複数のスレッドが共有データを変更している場合や、あるスレッドが他のスレッドがそのスレッドを読み込んでいる間にそのようなデータを変更している場合に発生します。データを他のものからQueue.Queueを介してアクセスされるONEモジュールが所有するようにすることを避けるのが最善ですが、実現できない場合は、ロックや他のより複雑な同期プリミティブに頼らざるを得ません。

これは、モジュール関数、静的メソッド、またはインスタンスメソッドで共有データにアクセスするかどうかに関係なく、インスタンス変数、クラス、またはグローバル変数(スコープとスレッドの安全性が本質的に互いに異なる関数ローカルデータは、本質的にスレッドセーフであることを除いて - 他のスレッドは、関数が共有コンテナを通じて意図的に "共有"するまで、関数インスタンス内のデータを見ることはありません。

threadingモジュールではなく、Pythonの標準ライブラリでmultiprocessingモジュールを使用すると、実際にはプロセス間でデータが共有されていないため、「スレッドの安全性」に気にする必要はありません。あなたはそれを変えるあなたの道から出ます、例えばmmap pedファイル;-)経由。

0

Pythonの一般的なスレッドセーフティの意味をよりよく理解するために、python documentationを参照してください。

ジャンゴ自体は1.0.3のようthread safeのようですが、あなたのコードではない可能性があり、あなたはそれを確認する必要があります...

私のアドバイスは、単にその気にして、サービスを提供していないことであろう(例えば、 'worker' MPMの代わりにapache 'prefork'を使用するなどして)複数のスレッドではなく複数のプロセスを使用するアプリケーションです。

+1

プリフォークMPMを使用する必要はありません。 mod_wsgiデーモンモードを使用できます。その場合、プロセスの数としてworker MPMを使用することができ、mod_wsgiデーモンモードで使用されるスレッドは個別に制御されます。プリフォークの使用は、mod_pythonまたはmod_wsgiの組み込みモードでのみ必要です。 –

関連する問題