Python线程和全局变量

时间:2010-10-09 15:38:24

标签: python multithreading global-variables

假设我在名为“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”var):

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

答案 0 :(得分:4)

将'addCount'传递给'calculate'函数,在'calculate'中返回'a'的值,并将其分配给MyThread实例中的新属性。

def calculate(addCount):
    a = random.randint(0, 5) + addCount
    return a

答案 1 :(得分:2)

python中的模块是单例,因此您可以将全局变量放在模块globalModule.py中,并同时具有firstModule,secondModule和mainModule import globalModule,并且它们都将访问相同的addCount。

但是,一般来说,线程拥有全局状态是一种不好的做法。

这永远不会奏效:

打印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