在看了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 worker。是local()
由gevent修补?或者是否存在竞争条件,在使用gevent时可能使用其他请求的活动语言提供请求?
感谢。
答案 0 :(得分:2)
Ok没关系,我在gevent's documentation找到了答案:线程本地存储由gevent进行猴子修补,并成为greenlet-local存储。所以一切都应该是安全的。
以下是详细信息:
patch_thread()
函数修补了thread
和threading
模块,包括使线程本地存储成为greenlet-local存储的补丁。patch_all()
函数调用patch_thread()
。patch_all()
函数。