Ist Python globale Variablen Thread-sicher?
Frage
edit: im fragen, wenn die globalen Variablen sind sicher in einem Single-Threaded-Web-Framework wie Tornado
im mit dem mongoengine orm, die eine Datenbankverbindung von einer globalen Variablen wird:
_get_db() # gets the db connection
im auch Tornado mit, ein Single-Threaded-Python-Web-Framework. in einer bestimmten Ansicht, ich brauche eine Datenbankverbindung zu packen und ein DBRef
Objekt [ähnlich einen Fremdschlüssel] dereferenzieren:
# dereference a DBRef
_get_db().dereference(some_db_ref)
, da die Verbindung wieder von _get_db
eine globale var ist, gibt es eine Möglichkeit einer Kollision und der falsche Wert an den falschen Thread zurückgegeben wird?
Lösung
Unter der Annahme, MongoEngine wickelt PyMongo (und ich glaube, es ist), dann sollten Sie in Ordnung sein. PyMongo vollständig Thread-sicher.
Andere Tipps
Themen sind immer erforderlich, um die GIL zu halten, wenn die Interaktion mit Python-Objekten. Der Namensraum der Variablen hält, ist ein Python-Objekt (entweder ein frameobject oder ein dict, je nachdem, welche Art von Variable ist.) Es ist immer sicher zu bekommen oder Setvariablen in mehreren Threads. Sie werden nie Müll Daten.
Allerdings sind die üblichen Rennbedingungen gelten als zu dem Objekt, das Sie erhalten, oder welches Objekt Sie ersetzen, wenn Sie zuweisen. Eine Aussage wie x += 1
ist nicht Thread-sicher, da ein anderer Thread zwischen dem get und den Laden laufen, um den Wert von x
ändert, was würden Sie dann überschreiben.
Nein, aber Schlösser sind ziemlich einfach in Python zu verwenden. Verwenden Sie den Versuch: endlich. Muster, um sicherzustellen, dass eine Sperre freigegeben, nachdem Sie Ihre globale Variable ändern
Es gibt nichts über Globals, die sie mehr oder weniger Faden sicher als alle anderen Variablen macht. Unabhängig davon, ob es möglich, dass ein Betrieb falsche Ergebnisse fehlschlagen oder zurückgeben, wenn in verschiedenen Threads läuft, die beste Praxis ist, dass Sie Schutz Daten zwischen Threads gemeinsam genutzt.
Wenn ich Sie recht gerade lese, Sie fragt, ob eine Variable in einer Singlethread-Umgebung sicher ist. In diesem Fall, wo Daten sind nicht zwischen gleichzeitigen Prozessen gemeinsam ist die Variable sicher (immerhin gibt es nichts anderes ausgeführt wird, dass sie unterbrechen).