【问题标题】:Reloading global Python variables in a long running process在长时间运行的进程中重新加载全局 Python 变量
【发布时间】:2012-07-13 14:50:28
【问题描述】:

我有每天左右重新启动的 celery Python 工作进程。它们执行 Python/Django 程序。

我已经设置了一些准全局值,这些值应该在整个过程中保持在内存中。也就是说,我有某些 MySQL 查询集不经常更改,因此会被评估一次,并在进程开始后立即存储为 CONSTANT(一个不好的例子是 PROFILE = Profile.objects.get(user_id=5))。

假设我想在 celery 进程中重置这个值而不执行一个全新的程序。

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

这看起来很hacky。我通常使用诸如 Memcached 之类的外部服务来协调多个进程之间的内存,但每隔一段时间,我认为本地内存比通过网络调用 NoSQL 存储更可取。

【问题讨论】:

    标签: python django multithreading memory process


    【解决方案1】:

    不看代码有点难说,但是导入只是设置一个引用,就像变量赋值一样:也就是说,如果数据发生变化,引用也会发生变化。当然,这只适用于您导入的父上下文(否则赋值将更改引用,而不是更新值。)

    换句话说,如果你这样做:

    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 重新绑定到其他值,但第一个引用仍指向旧值。

    【讨论】:

    • 太棒了,说得通。谢谢丹尼尔
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2012-03-29
    • 2019-03-31
    • 1970-01-01
    相关资源
    最近更新 更多