如何在Python线程和函数中共享全局变量

时间:2018-11-26 14:06:54

标签: python multithreading global-variables

对于一个简单的程序,我有两个文件MyConfig.py:

class MyConfig(object):
        a = False
        b = 0

还有mytest.py:

import sys

# Globals
sys.path.append('.')
from MyConfig import MyConfig

def test():
        MyConfig.a = False
        MyConfig.b = 32
        print("MyConfig.a = {}".format(MyConfig.a))
        print("MyConfig.b = {}".format(MyConfig.b))

if __name__ == '__main__':

        if len(sys.argv) == 2:
                MyConfig.a = True
                MyConfig.b = int(sys.argv[1])

        print("MyConfig.a = {}".format(MyConfig.a))
        print("MyConfig.b = {}".format(MyConfig.b))

        test()

输出:

MyConfig.a = True
MyConfig.b = 3
MyConfig.a = False
MyConfig.b = 32

这似乎是一种令人费解的共享某些配置信息的方法,但是我似乎无法在多线程Python应用程序中执行相同的操作。在此应用中,在启动时分配了MyConfig.x MyConfig.y和MyConfig.z。

如果我做同样的事情,请在threadapp.py中:

import sys

# Globals
sys.path.append('.')
from MyConfig import MyConfig

# Some functions used by the app
...

def data_export(queue):
   ...

def worker(queue):
   ...

def process(data, foo):
   ...

def thread(iterator):
   processes = []
   data = Queue()
   data_factory = Process(target = data_export, args = (data,))
   data_factory.daemon = True
   processes.append(data_factory)
   data_factory.start()
   work = Process(target = worker, args = (data,))
   work.daemon = True
   processes.append(work)
   work.start()
   data_factory.join()

def main():

    cfg = MyConfig()

    if len(sys.argv) == 2:
        cfg.a = True
        cfg.b = int(sys.argv[1])

    print ("cfg.a = {}".format(cfg.a))
    print ("cfg.b = {}".format(cfg.b))

    try:
        pool = ThreadPool(processes = multiprocessing.cpu_count()*2)
        pool.map(thread, range(0, 10))
    except:
        pool.close()
        exit()

if __name__ == '__main__':
    main()

我的问题是我无法在线程使用的函数中的任何位置访问全局MyConfig(cfg)。我可以看到在启动程序时在cfg。中的main()中设置了变量,但是当我尝试在线程使用的函数中访问它们时,它们都被设置为默认值,并且无法设置他们,然后读回去。

我已经花了好几个小时没有任何运气,只搜索了简单的全局变量,在其中我会在想要读取或修改全局变量的函数中声明“ global foo”。我似乎在这里无法做到这一点。

任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

要声明全局线程2,

def thread2(threadname):
    global a
    while True:
        a += 1
        time.sleep(1)

在线程1中,您不需要执行任何特殊操作,只要您不尝试修改a的值即可(这会创建一个局部变量,该局部变量遮蔽全局变量;如果需要,请使用global a )>

def thread1(threadname):
    #global a       # Optional if you treat a as read-only
    while a < 10:
        print a