2012-07-13 80 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