2016-11-10 56 views
0

比方說,我有一個Django Web應用程序與兩個用戶。我的Web應用程序具有服務器上存在的全局變量(根據來自外部SQL數據庫的數據創建的Pandas Dataframe)。Django - 兩個用戶訪問相同的數據

假設一個用戶進行update請求到Dataframe而現在Dataframe正在更新。當Dataframe正在更新時,另一個用戶對該數據幀發出get請求。有沒有辦法「鎖定」Dataframe,直到用戶1完成並完成用戶2的請求爲止?

編輯:

所以事件的順序應該是:

用戶1作出了更新請求,數據幀被鎖定,用戶2發出GET請求,數據幀完成更新,數據幀被解鎖,用戶2得到他/她的要求。

代碼行將不勝感激!

+0

「我的web應用程序有一個全局變量...」 - 停在那裏。編號 –

+0

全局變量並不總是邪惡的,但你必須意識到它們是如何在多線程應用程序的環境中工作的,你不控制線程 –

+0

@MadWombat 我明白,我應該如何處理這個問題?如果兩個用戶都試圖從外部數據庫收集相同的數據,那麼將其緩存正確有意義? –

回答

2

Ehm ... Django不是服務器。它有一個單線程開發服務器,但它不應該用於開發之外的任何事情,甚至可能不是這樣。 Django應用程序使用WSGI進行部署。運行應用程序的WSGI服務器很可能會啓動多個單獨的工作線程,並將根據其配置中的規則查殺並重新啓動這些線程。

這意味着,你不能依靠多個請求擊中相同的過程。 Django應用程序生命週期介於獲取請求和返回響應之間。任何在這兩個事件之間沒有明確執行的事情都應該被視爲沒有了。

因此,當您的某個用戶更新全局變量時,此變量只存在於此用戶隨機訪問的一個進程中。第二個用戶可能會也可能不會碰到同一個進程,因此可能會或可能不會獲得相同的變量副本。更重要的是,這個過程遲早會被WSGI服務器殺死,並且所有更新都將消失。

我所得到的是你可能想在重新思考你的架構之前,你麻煩原子更新問題。

+0

對不起,這是漫長的一天。我正在通過WSGI部署我的應用程序。 如果兩個用戶嘗試從外部數據庫訪問相同的數據,那麼將其正確地捕獲是否合理? –

+0

你能和你想要將數據更新寫回到SQL數據庫中嗎? –

+0

我可以和我想寫回數據。 –

1

如果你要改變它們,不要共享內存對象。併發性很難做到正確,過早優化是邪惡的。爲每個用戶提供他們自己的數據視圖,並僅通過數據庫共享數據(使用事務來使您的更新原子化)。每次更新數據庫時都會保留和增加數據庫中的計數器,如果這些數據在讀取數據後發生了更改(如其他人已將其更改),則會導致事務失敗。

另外,當疲倦的時候不要做出重要的架構決定! :)

+0

謝謝,我想我會採取這種做法! –

相關問題