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

时间:2018-10-15 13:53:46

标签: python python-3.x python-multithreading

我正在尝试使较大程序的不同文件中的函数相互发送消息。有一个没有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。

为什么正在运行的进程不会修改此导入的全局变量,如何对其进行重构以使其起作用?

2 个答案:

答案 0 :(得分:2)

导入名称has_run时,您在名为has_run的当前模块中创建了一个新全局变量,该全局变量指向与file1.has_run相同的对象,但是 assignment < / em>到其中一个名称不影响另一个。如果要查看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
>>>

答案 1 :(得分:1)

我相信您可以在this question中找到有关在Python线程之间共享变量的详细信息。

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