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?

War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top