在长时间运行的进程中重新加载全局Python变量

时间:2012-07-13 14:50:28

标签: python django multithreading memory process

我有芹菜Python工作进程,每天都会重启。他们执行Python / Django程序。

我设置了某些准全局值,这些值应该在进程持续时间内保留在内存中。也就是说,我有一些不经常更改的MySQL查询集,因此在进程启动时会被评估一次并存储为CONSTANT(一个错误的例子是PROFILE = Profile.objects.get(user_id = 5))。

假设我想在不执行全新程序的情况下在芹菜过程中重置此值。

此值在许多不同的模块中导入(和使用)。我假设我必须通过sys.modules中的每一个导入CONSTANT并删除/重置密钥?是吗?

这看起来非常h​​acky。我通常使用像Memcached这样的外部服务来协调多个进程之间的内存,但每隔一段时间,我认为本地内存优于通过网络调用NoSQL存储。

1 个答案:

答案 0 :(得分: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反弹为其他内容,但第一个引用仍然指向旧值。