/ / Sind Übersetzungen in Django greenlet-sicher? - Django, Internationalisierung, Gevent, Gunicorn

Sind Übersetzungen in Django greenlet-sicher? - Django, Internationalisierung, Gevent, Gunicorn

Nach einem Blick auf Djangos Quellcode sehe ich, dass Django die aktive Sprache im aktuellen Thread speichert.

Im django.utils.translation.trans_real:

_active = local()
...
def activate(language):
"""
Fetches the translation object for a given tuple of application name and
language and installs it as the current translation object for the current
thread.
"""
_active.value = translation(language)

Das ist alles in Ordnung, aber ich bin nicht sicher, ob es Greenlet-sicher ist oder nicht? Ich lasse Django mit Gunicorn laufen, konfiguriert um "grüne" Gevent-Arbeiter zu führen local() Affe-Patch von Gevent? Oder gibt es eine Race-Bedingung, bei der eine Anfrage unter Verwendung der aktiven Sprache einer anderen Anfrage bedient werden kann, wenn gevent verwendet wird?

Vielen Dank.

Antworten:

1 für die Antwort № 1

Ok, ich habe die Antwort schon gefunden gevents Dokumentation: Thread-lokaler Speicher wird von gevent mit Affen gepatcht und wird zu Greenlet-lokalem Speicher. Also sollte alles sicher sein.

Hier sind die Details:

  • gevent "s patch_thread() Funktion patcht die thread und threading Module, einschließlich des Patches, um den lokalen Threadspeicher zu einem Greenlet-lokalen Speicher zu machen.
  • gevent "s patch_all() Funktionsaufrufe patch_thread().
  • gunicorn nennt gevent "s patch_all() Funktion beim Starten eines Gevent Workers.