/ / Les traductions sont-elles greenlet-safe dans Django? - Django, internationalisation, gevent, gunicorn

Les traductions sont-elles sûres à Django? - Django, internationalisation, gevent, gunicorn

Après avoir jeté un œil au code source de Django, je constate que Django stocke la langue active dans le fil de discussion actuel.

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

Tout va bien, mais je ne suis pas sûr de savoir si c'est sûr pour les greenlets? Je suis sous Django avec gunicorn, configuré pour exécuter des ouvriers «verts» de gevent. local() singe patché par Gevent? Ou existe-t-il une situation de concurrence critique dans laquelle une demande peut être exécutée à l'aide d'une autre langue active de la demande lors de l'utilisation de gevent?

Merci.

Réponses:

1 pour la réponse № 1

Ok tant pis, j'ai trouvé la réponse dans documentation de gevent: le stockage local des threads est patché par gevent et devient le stockage local de greenlet. Donc, tout devrait être en sécurité.

Voici les détails:

  • gevent "s patch_thread() la fonction patche le thread et threading modules, y compris le correctif pour que le stockage local au thread devienne un stockage local au greenlet.
  • gevent "s patch_all() appels de fonction patch_thread().
  • gunicorn appelle gevent "s patch_all() fonctionner lors du démarrage d'un travailleur gevent.