Python线程和全局变量
假设我在一个叫做 "firstModule.py" 的模块里有以下这个函数:
def calculate():
# addCount value here should be used from the mainModule
a=random.randint(0,5) + addCount
现在我有另一个模块叫做 "secondModule.py":
def calculate():
# addCount value here too should be used from the mainModule
a=random.randint(10,20) + addCount
我正在运行一个叫做 "mainModule.py" 的模块,它里面有以下内容(注意全局的 "addCount" 变量):
import firstModule
import secondModule
addCount=0
Class MyThread(Thread):
def __init__(self,name):
Thread.__init__(self)
self.name=name
def run(self):
global addCount
if self.name=="firstModule":
firstModule.calculate()
if self.name=="secondModule":
secondModule.calculate()
def main():
the1=MyThread("firstModule");
the2=MyThread("secondModule");
the1.start()
the2.start()
the1.join()
the2.join()
# This part doesn't work:
print firstModule.a
print secondModule.a
基本上,我想让两个模块里的 "addCount" 值都和 "mainModule" 里的相同。然后,当线程完成后,我想在这两个模块里打印出 "a" 的值。上面的例子不管用。我在想怎么才能解决这个问题。
2 个回答
2
在Python中,模块是单例的,这意味着你可以把全局变量放在一个叫做globalModule.py的模块里,然后让firstModule、secondModule和mainModule都通过import globalModule
来引入它们,这样它们就可以共享同一个addCount变量。
不过,通常来说,让多个线程共享全局状态并不是个好主意。
下面这个例子是行不通的:
print firstModule.a
print secondModule.a
因为在这里:
def calculate():
# addCount value here should be used from the mainModule
a=random.randint(0,5) + addCount
a
是函数calculate
的局部变量。
如果你真的想把a
写成模块级别的变量,你需要加上全局声明:
def calculate():
# addCount value here should be used from the mainModule
global a
a=random.randint(0,5) + addCount
4
把 'addCount' 这个值传给 'calculate' 这个函数,然后在 'calculate' 里返回 'a' 的值,最后把这个值赋给 MyThread 实例的一个新属性。
def calculate(addCount):
a = random.randint(0, 5) + addCount
return a