对于一个简单的程序,我有两个文件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”。我似乎在这里无法做到这一点。
任何帮助表示赞赏。
答案 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