Python:从线程更新全局

时间:2014-05-02 23:59:38

标签: python

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

我正在尝试从线程中更新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没有更新。

出了什么问题?

2 个答案:

答案 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