/ / Djangoの翻訳はグリーンセーフですか? -ジャンゴ、国際化、gevent、gunicorn

Djangoで翻訳はグリーンレットセーフですか? - ジャンゴ、国際化、gevent、gunicorn

Djangoのソースコードを見てみると、Djangoはアクティブな言語を現在のスレッドに保存していることがわかります。

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)

これで大丈夫ですが、「安全」かどうかはわかりません。 「グリーン」geventワーカーを実行するように構成されたgunicornでDjangoを実行しています。 local() geventによるモンキーパッチまたは、geventを使用しているときに、別のリクエストのアクティブな言語を使用してリクエストが処理される競合状態がありますか?

ありがとう。

回答:

回答№1は1

わかった、答えを見つけた geventのドキュメントスレッドローカルストレージはgeventによってモンキーパッチされ、グリーンローカルストレージになります。だから、すべてが安全でなければなりません。

詳細は次のとおりです。

  • gevent "s patch_thread() 機能パッチ thread そして threading スレッドローカルストレージをグリーンレットローカルストレージにするためのパッチを含むモジュール。
  • gevent "s patch_all() 関数呼び出し patch_thread().
  • gunicornはgeventを呼び出します patch_all() geventワーカーを開始するときの関数。