Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:从线程更新全局_Python - Fatal编程技术网

Python:从线程更新全局

Python:从线程更新全局,python,Python,有几个类似的问题,我已经应用了建议的方法,但它似乎不起作用 我正在尝试从线程更新主控中的全局变量DYNOK: 主人 线 我期望的是主控打印为True,但是全局DYNOK似乎没有得到更新 怎么了?由于主线程和线程是独立的文件(基于导入),因此它们也是具有自己名称空间的独立模块 所以,要使您拥有的工作,您需要从thr导入master,然后在那里使用master.DYNOK。然而,这不起作用,因为它会创建一个循环依赖项,因为master也会导入thr 如果您想保持模块分开但共享状态,您可以创建第三个文

有几个类似的问题,我已经应用了建议的方法,但它似乎不起作用

我正在尝试从线程更新主控中的全局变量DYNOK:

主人 线 我期望的是主控打印为True,但是全局DYNOK似乎没有得到更新


怎么了?

由于主线程和线程是独立的文件(基于导入),因此它们也是具有自己名称空间的独立模块

所以,要使您拥有的工作,您需要从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