2012-07-13 69 views
1

我有芹菜Python工作進程,每天都會重新啓動。他們執行Python/Django程序。在長時間運行的進程中重新加載全局Python變量

我已經設置了某些準全局值,該值在整個過程中應該保持在內存中。也就是說,我有一些不經常更改的MySQL查詢集,因此一旦進程開始(一個不好的例子是PROFILE = Profile.objects.get(user_id = 5)),就進行一次評估並存儲爲CONSTANT。

假設我想在芹菜過程中重置此值,而無需執行全新的程序。

該值在多個不同的模塊中導入(並使用)。我假設我必須通過sys.modules中的每一個導入CONSTANT並刪除/重置密鑰?是對的嗎?

這似乎很hacky。我通常使用Memcached等外部服務來協調多個進程之間的內存,但每過一段時間,我都認爲本地內存優於通過網絡調用NoSQL存儲。

回答

2

如果沒有看到一些代碼,但導入只是設置一個引用,就像變量賦值一樣:也就是說,如果數據改變,引用也會改變,這有點難。當然,雖然如果它已經導入父上下文這僅適用(否則任務將改變參考,而不是更新的價值。)

換句話說,如果你這樣做:

from mypackage import mymodule 
do_something_with(mymodule.MY_CONSTANT) 

#elsewhere 
mymodule.MY_CONSTANT = 'new_value' 

那麼對mymodule.MY_CONSTANT的所有引用都將獲得新值。但是,如果你這樣做:

from mypackage.mymodule import MY_CONSTANT 

# elsewhere 
mymodule.MY_CONSTANT = 'new_value' 

原件備查不會得到新的價值,因爲你已經反彈MY_CONSTANT別的東西,但在第一次引用在舊值仍指向。

+0

輝煌,非常有意義。謝謝丹尼爾 – Ben 2012-07-13 17:39:48

+0

幫了我很多,謝謝! – Krishh 2018-03-05 14:15:05