Python线程和全局变量

0 投票
2 回答
3161 浏览
提问于 2025-04-16 05:14

假设我在一个叫做 "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

撰写回答