0

在查看了 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)    

这一切都很好,但我不确定它是否是绿色安全的?我正在使用 gunicorn 运行 Django,配置为运行“绿色”gevent 工作人员。local()猴子补丁是gevent吗?或者是否存在竞争条件,在使用 gevent 时可能会使用另一个请求的活动语言来服务请求?

谢谢。

4

1 回答 1

2

好吧,没关系,我在gevent 的文档中找到了答案:thread-local storage 被 gevent 打了猴子补丁,变成了 greenlet-local storage。所以一切都应该是安全的。

这是详细信息:

  • gevent 的patch_thread()功能补丁threadthreading模块,包括补丁使线程本地存储成为greenlet本地存储。
  • gevent 的patch_all()函数调用patch_thread()
  • patch_all()gunicorn在启动 gevent worker 时调用 gevent 的函数。
于 2013-04-07T09:44:45.053 回答