有几个类似的问题,我已经应用了建议的方法,但它似乎不起作用。
我正在尝试从线程中更新master中的全局变量DYNOK:
import time
import thr
global DYNOK
DYNOK = False
th = thr.thr()
th.start()
time.sleep(1)
print(DYNOK)
from threading import Thread
class thr(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
global DYNOK
DYNOK = True
print(DYNOK)
我期待主人打印True,但看起来全局DYNOK没有更新。
出了什么问题?
答案 0 :(得分:2)
由于您的主文件和线程是单独的文件(基于导入),因此它们也是具有自己的命名空间的独立模块。
因此,为了使你有工作,你需要从thr导入master,然后在那里使用master.DYNOK。但这并不起作用,因为它会创建一个循环依赖,因为master也会导入thr。
如果你想保持模块分开但共享状态你可以创建第三个文件,例如模块,例如state.py,然后在那里说DYNOK = False。并导入州和在master和thr中使用state.DYNOK。执行此操作时,无需在任何地方使用全局关键字。
答案 1 :(得分:0)
OP建议的替代解决方案是使用回调函数进行通信。沿着这些方向:
主人:(部分,见OP填补空白)
DYNOK = False
def setDYNOK(val):
global DYNOK
DYNOK = val
print "New value for DYNOK set:", DYNOK
th = thr.thr(setDYNOK) #pass the callback func to the thread initialiser
...
主题:
from threading import Thread
class thr(Thread):
def __init__(self, callback):
Thread.__init__(self)
self.callback = callback
def run(self):
self.callback(True) #calls Master's setDYNOK to communicate new value