5

編集:竜巻のようなシングルスレッドのWebフレームワークでグローバル変数が安全かどうかを尋ねる

グローバル変数からデータベース接続を取得するmongoengineormを使用しています。

_get_db() # gets the db connection

また、シングルスレッドのPythonWebフレームワークであるtornadoも使用しています。ある特定のビューでは、データベース接続を取得してDBRefオブジェクトを逆参照する必要があります[外部キーと同様]:

# dereference a DBRef
_get_db().dereference(some_db_ref)

によって返される接続は_get_dbグローバル変数であるため、衝突や間違った値が間違ったスレッドに返される可能性はありますか?

4

4 に答える 4

3

Pythonオブジェクトと対話するとき、スレッドは常にGILを保持する必要があります。変数を保持する名前空間はPythonオブジェクトです(変数の種類に応じて、frameobjectまたはdictのいずれかです)。複数のスレッドで変数を取得または設定することは常に安全です。ガベージデータを取得することはありません。

ただし、通常の競合状態は、取得するオブジェクト、または割り当てるときに置き換えるオブジェクトに関して適用されます。のようなステートメントはスレッドセーフでx += 1はありません。getとstoreの間で別のスレッドが実行され、の値が変更xされてから上書きされる可能性があるためです。

于 2010-02-11T23:13:05.073 に答える
2

MongoEngineがPyMongoをラップしていると仮定すると(そして私はそれがそうだと信じています)、あなたは大丈夫なはずです。PyMongoは完全にスレッドセーフです。

于 2010-02-12T02:03:12.417 に答える
1

いいえ。ただし、Pythonでロックを使用するのは非常に簡単です。try:finally:パターンを使用して、グローバル変数を変更した後にロックが解放されるようにします。

于 2011-04-18T16:07:57.410 に答える
0

グローバルについては、他の変数よりもスレッドセーフになるものは何もありません。異なるスレッドで実行したときに操作が失敗したり、誤った結果を返したりする可能性があるかどうかにかかわらず、ベストプラクティスは、スレッド間で共有されるデータを保護することです。

私があなたを正しく読んでいるなら、あなたは変数がシングルスレッド環境で安全であるかどうかを尋ねています。この場合、並行プロセス間でデータが共有されない場合、変数は安全です(結局、それを中断する可能性のある実行中のものは他にありません)。

于 2010-02-11T23:31:36.743 に答える