在运行时更改导入函数的全局变量
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
>>>
我正在尝试让大型程序的不同文件中的函数相互发送消息。有一个函数没有 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
>>>