在运行时更改导入函数的全局变量

change global variable at runtime for imported function

我正在尝试让大型程序的不同文件中的函数相互发送消息。有一个函数没有 return 语句。在一个测试示例中,如果我在一个文件中执行以下操作,我可以更改一个全局变量并在 运行 时间检测到它的变化:

one_file.py

import time
import threading
has_run = False

def processing_function():
    global has_run
    time.sleep(5)
    has_run = True

start = time.clock()

thread = threading.Thread(target=processing_function)
thread.start()

while True:
    print(has_run)
    time.sleep(0.5)
    if (10/3600) < time.clock() - start:
        break

当运行时,这将打印 False 一段时间然后开始打印 True。

我试图让它在两个文件中工作,如下所示:

file1.py

import time
has_run = False

def processing_function():
    global has_run
    time.sleep(5)
    has_run = True

file2.py

from file1 import processing_function, has_run
import time
import threading

start = time.clock()
thread = threading.Thread(target=processing_function)
thread.start()

while True:
    print(has_run)
    time.sleep(0.5)
    if (10/3600) < time.clock() - start:
        break

如果你现在 运行 file2.py,它只会多次打印 False。

为什么这个导入的全局变量没有被 运行ning 进程修改,如何重构它才能正常工作?

我相信您可以在 this question.

中找到 Python 中线程之间共享变量的详细信息

本质上,在线程之间共享任何状态(包括变量)都需要同步(例如使用 threading.Condition)。否则,您将冒 race condition 一个或多个线程竞争访问变量的风险。

当您导入名称 has_run 时,您在当前模块中创建了一个名为 has_run 的新全局变量,它引用与 file1.has_run 相同的对象,但是 [=29] =]分配给其中一个名字不影响另一个。如果要查看processing_function所做的修改,需要继续通过模块访问名称

while True:
    print(file1.has_run)
    ...

(这是因为 processing_function 为其全局分配了一个新值,而不是改变现有值。)

您可以通过一个更简单的示例来观察这一点。考虑一个非常简单的模块 tmp1:

x = 3

现在看看 from tmp1 import x 如何创建一个全局变量,其值保持独立于 tmp1.x:

>>> import tmp1
>>> from tmp1 import x
>>> x
3
>>> tmp1.x
3
>>> x = 6
>>> tmp1.x
3
>>> tmp1.x = 5
>>> tmp1.x
5
>>> x
6
>>>