我正在尝试使较大程序的不同文件中的函数相互发送消息。有一个没有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。
为什么正在运行的进程不会修改此导入的全局变量,如何对其进行重构以使其起作用?
答案 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。