2013-04-07 97 views
0

在看了一下Django的源代碼之後,我發現Django在當前線程中存儲了活動語言。翻譯Django中的greenlet-safe?

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)  

這都是很好,但我不知道它是否是greenlet安全的嗎?我使用gunicorn運行Django,配置爲運行「綠色」gevent工作者。是local()由gevent猴子補丁?或者,在使用gevent時,是否存在使用其他請求的活動語言提供請求的競爭條件?

謝謝。

回答

1

好吧,沒關係,我在gevent's documentation找到了答案:線程本地存儲被gevent修補併成爲greenlet-local存儲。所以一切都應該是安全的。

下面是詳細信息:

  • GEVENT的patch_thread()功能補丁的threadthreading模塊,包括補丁,使線程本地存儲成爲greenlet本地存儲。
  • gevent的patch_all()函數調用patch_thread()
  • gunicorn在啓動gevent worker時調用gevent的patch_all()函數。