关于多线程:Python线程和全局变量

Python threads and global vars

假设我在名为"firstmodule.py"的模块中具有以下功能:

1
2
3
def calculate():
  # addCount value here should be used from the mainModule
   a=random.randint(0,5) + addCount

现在我有一个不同的模块叫做"secondmodule.py":

1
2
3
def calculate():
  # addCount value here too should be used from the mainModule
   a=random.randint(10,20) + addCount

我正在运行一个名为"mainmodule.py"的模块,其中包含以下内容(请注意全局"addcount"var):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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"。上面的例子不起作用。我在想我怎么修理它。


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

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

python中的模块都是单件的,所以您可以将全局变量放在module globalmodule.py中,并同时具有firstmodule、secondmodule和mainmodule import globalModule,它们都可以访问相同的addcount。

但是,一般来说,线程具有全局状态是一种糟糕的实践。

这永远不会奏效:

打印第一个模块.a打印第二模块A

因为在这里:

1
2
3
def calculate():
   # addCount value here should be used from the mainModule
   a=random.randint(0,5) + addCount

a是函数calculate的局部变量。

如果您真的想将a作为模块级变量写入,请添加全局声明:

1
2
3
4
def calculate():
   # addCount value here should be used from the mainModule
   global a
   a=random.randint(0,5) + addCount