2010-11-22 68 views
3

如果我閱讀了django文檔,只有關於模板標籤的文檔提到了線程安全的潛在危險。Django和線程安全

不過,我很好奇,什麼樣的事情,我要做/避免寫在Django線程安全的代碼...

一個例子是,我有以下功能配置中使用的記錄器Django的。

_LOGGER_CONFIGURED = False 

def config_logger(): 
    global _LOGGER_CONFIGURED 
    if _LOGGER_CONFIGURED: return 
    _LOGGER_CONFIGURED = True 

    rootlogger = logging.getLogger('') 
    stderr_handler = StreamHandler(sys.stderr) 
    rootlogger.addHandler(stderr_handler) 

,並在我的根URL配置結束後,我有以下函數調用:

config_logger() 

的問題是:

  1. 這段代碼線程?

  2. django線程之間共享什麼樣的變量?

+0

您的意思是線程不安全的潛在危險:p – Edmund 2010-11-22 22:46:48

+0

我認爲有線程不安全的潛在地方(其中一些被人指出)。 -urlresolver使用全局可變字典,如果服務器啓動時出現併發請求,則可以將此對象置於不確定狀態。 -many django表單和字段類都有全局計數器......我不知道它們是如何使用的,但它似乎並不像訪問它們那樣不受互斥體保護。我想這可能是潛在的危險。 – 2010-12-15 07:07:10

回答

1

有沒有真正一大堆你可以做Django模板及其與線程問題,除了不使用它們,或者至少不使用對線程問題敏感的標籤。沒有太多的django模板標籤確實存在問題,只有有狀態的模板標籤,例如cycle

在你給出的例子中,你沒有對線程安全做任何事情,你也不應該這樣做:logging模塊已經完全線程安全,只要你以正常的方式使用它,這是在需要它的模塊中調用logging.getLogger,在您的settings.pyLOGGINGLOGGING_CONFIGset appropriately。不需要聰明。

您可能會關心的其他事情是面對併發更新時的數據庫完整性。不要這樣,如果你使用的是PostgreSQL或MySQL/INNOdb數據庫,那麼你完全免受併發神經網絡的攻擊。