Python:从线程更新全局
有几个类似的问题,我已经应用了建议的方法,但它似乎不起作用 我正在尝试从线程更新主控中的全局变量DYNOK: 主人 线 我期望的是主控打印为True,但是全局DYNOK似乎没有得到更新Python:从线程更新全局,python,Python,有几个类似的问题,我已经应用了建议的方法,但它似乎不起作用 我正在尝试从线程更新主控中的全局变量DYNOK: 主人 线 我期望的是主控打印为True,但是全局DYNOK似乎没有得到更新 怎么了?由于主线程和线程是独立的文件(基于导入),因此它们也是具有自己名称空间的独立模块 所以,要使您拥有的工作,您需要从thr导入master,然后在那里使用master.DYNOK。然而,这不起作用,因为它会创建一个循环依赖项,因为master也会导入thr 如果您想保持模块分开但共享状态,您可以创建第三个文
怎么了?由于主线程和线程是独立的文件(基于导入),因此它们也是具有自己名称空间的独立模块 所以,要使您拥有的工作,您需要从thr导入master,然后在那里使用master.DYNOK。然而,这不起作用,因为它会创建一个循环依赖项,因为master也会导入thr
如果您想保持模块分开但共享状态,您可以创建第三个文件,即module,例如state.py,然后在那里说DYNOK=False。并在master和thr中导入state并使用state.DYNOK。执行此操作时,任何地方都不需要全局关键字。OP建议的另一种解决方案是使用回调函数进行通信。按照这些思路: 硕士:(部分,参见OP以填补空白) 线程:
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
理解,但创建一个模块只是为了保存一个变量似乎有点奇怪。可以使用从线程到主线程的回调吗?或者这有相同的问题吗?没有问题:从主线程创建线程时,可以将回调函数作为参数传递,然后在线程中保留对它的引用,并在需要时调用它。不需要导入,因此循环DEP没有问题。好主意,我会说:)你能告诉我如何将回调函数传递给线程吗?好的,我会在另一个答案中这样做,因为注释无法格式化
from threading import Thread
class thr(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
global DYNOK
DYNOK = True
print(DYNOK)
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