Pythonのグローバル変数はスレッドセーフか?
質問
編集:グローバル変数は竜巻のようなシングルスレッドのWebフレームワークに安全であるかどうかを尋ねるイム
グローバル変数からデータベース接続を取得mongoengineのORMを使用してIM
_get_db() # gets the db connection
また、竜巻、シングルスレッドのPython Webフレームワークを使用してイム。一つの特定のビューで、私は、データベース接続を取得し、[外部キーに似] DBRef
オブジェクトを逆参照する必要があります
# dereference a DBRef
_get_db().dereference(some_db_ref)
_get_db
によって返された接続は、グローバルvarがあることから、衝突の可能性があると、間違った値が間違ったスレッドに返される?
解決
、あなたは問題ないはずです。 PyMongoは完全にスレッドセーフです。
他のヒント
スレッドは常にPythonオブジェクトと相互作用する場合GILを保持するために必要とされます。変数を保持している名前空間はPythonオブジェクトである(それは、変数の種類に応じて、frameobjectやdictのいずれかで、。)これは、複数のスレッド内の変数を取得または設定するために、常に安全です。あなたはゴミデータを取得することはありません。
あなたが得る、またはあなたが割り当てたときに置き換えるオブジェクトどのオブジェクトにどのようしかし、通常のレース条件が適用されます。別のスレッドはあなたがして上書きしてしまいれ、x += 1
の値を変更します。
x
のような文は、のないのスレッドセーフであります いいえ、しかし、ロックはpythonで使用する非常に簡単です。あなたはグローバル変数を変更した後、ロックが解除されることを保証するために、パターン
:最後に:試して使用してください。他の変数よりも、それらがどの多かれ少なかれ、スレッドセーフになりグローバルについては何もありません。操作が失敗するか、別のスレッドで実行すると、誤った結果を返すようにするためにそれが可能だかどうかにかかわらず、ベストプラクティスは、は、スレッド間で共有されるデータを保護する必要があることです。の
私は右のあなたを読んでいる場合は、変数は、シングルスレッド環境で安全である場合は、、あなたが求めています。データはのの同時プロセス間で共有されていない。この場合では、変数は、(結局、それはそれを中断することが実行されている他に何もない)安全です。