2017-03-05 77 views
0

首先,以'是'開頭,我檢查並搜索了這個主題,但找不到任何能夠明確回答我的問題的內容?我是Djagno的初學者,並正在研究其文檔,其中我閱讀了針對模板標記的節點渲染方法的線程安全注意事項。以下是文檔Link的鏈接。我的問題在於它說明的地方一旦節點被解析,該節點的渲染方法可能會被多次調用我很困惑它是否在討論在相同的文檔中爲同一用戶在不同位置使用模板標籤在服務器服務器上的用戶的單一實例級別,模板標記用於來自世界各地的用戶的多個請求在內存中共享相同的django實例嗎?如果它的後者沒有django在服務器級別爲每個新的用戶請求創建一個新的實例,併爲每個用戶在內存中有單獨的資源,或者我錯了嗎?Django線程結構

回答

0

這是後者。

WSGI服務器通常運行多個持久進程,並在每個進程中運行多個線程。雖然可以應用一些自動縮放,但進程和線程的數量或多或少是恆定的,並且確定Django可以處理多少個併發請求。每個請求都會創建一個新的CGI進程的時代早已過去,在大多數情況下,持久化進程效率更高。

每個進程都有自己的內存,進程之間的通信通常由數據庫,緩存等來處理,它們不能通過內存直接進行通信。

進程內的每個線程共享相同的內存。這意味着任何不在本地範圍內的對象(例如,只能在函數中定義),都可以從其他線程訪問。緩存的模板加載器爲每個進程解析每個模板一次,並且每個線程使用相同的解析節點。這也意味着如果你設置了例如self.foo = 'bar'在一個線程中,每個線程將在訪問self.foo時讀取'bar'。由於多個線程同時運行,這可能很快變成一個無法調試的巨大混亂,這就是線程安全性如此重要的原因。

正如文檔所述,只要您不在self上存儲數據,但將其存入context.render_context,則應該沒問題。

+0

首先**感謝曼**。所以這裏是我對你答案的看法。基本上,服務器爲所有傳入請求創建一個進程,並且在每個進程中維護一些固定數量的線程,這些線程共享進程的全局資源。這就是爲什麼**線程安全性是必需的**。 –

+0

非常好,是的。如果你有一個繁忙的網站,你可能會使用多個進程,每個進程都有多個線程,但除此之外,你會發現。 – knbk