如何跨Python模块共享可变变量?

如何跨Python模块共享可变变量?,python,python-multithreading,Python,Python Multithreading,我需要在多个模块之间共享变量。当程序运行时,线程将异步更改这些变量 我需要能够通过多个模块同时访问变量的最新状态 多个模块也将写入同一变量 基本上,我需要的是一个共享内存空间,就像一个模块中的全局变量一样,但是可以由所有其他模块异步访问和更改 我熟悉在模块中锁定全局变量。我不知道从哪里开始跨多个模块执行此操作 它是如何完成的?将所有全局变量放在一个模块中,例如config.py,并将其导入整个模块: config.py: a=None varlock=None main.py: import

我需要在多个模块之间共享变量。当程序运行时,线程将异步更改这些变量

我需要能够通过多个模块同时访问变量的最新状态

多个模块也将写入同一变量

基本上,我需要的是一个共享内存空间,就像一个模块中的全局变量一样,但是可以由所有其他模块异步访问和更改

我熟悉在模块中锁定全局变量。我不知道从哪里开始跨多个模块执行此操作


它是如何完成的?

将所有全局变量放在一个模块中,例如config.py,并将其导入整个模块:

config.py:

a=None
varlock=None
main.py:

import config
import threading

config.a = 42
config.varlock = threading.RLock()
...
然后您可以使用全局锁实例(在main中实例化一次)来保护变量。每次在任何线程中修改其中一个线程时,请按如下所示进行操作

with config.varlock:
    config.a = config.a + 42
你应该没事的


汉努

这可能会有所帮助。有没有意外的后果?和/或我假设在更改内置变量时可以锁定变量?通常是这样做的吗?您可以看看它是如何为
django.settings
vars完成的。我想应该是这样做的。为这些变量维护父模块。为什么在main中实例化?有没有理由不把它全部保存在config.py中,然后将config导入所有模块?只要只创建一次RLock实例,这并不重要。如果做得不对,可能会创建几个锁实例,在这种情况下它们将无法工作。我经常使用全局变量和线程,我的工作方式是在main.py中处处包含config.py,实例化所有锁,然后启动线程并关闭。这确保了在设置那些应该是全局和“静态”的东西(例如锁)时没有并行性。