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 № 1Ok 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 lethread
etthreading
modules, y compris le correctif pour que le stockage local au thread devienne un stockage local au greenlet. - gevent "s
patch_all()
appels de fonctionpatch_thread()
. - gunicorn appelle gevent "s
patch_all()
fonctionner lors du démarrage d'un travailleur gevent.