2010-10-09 1 views
0

Скажем, у меня есть следующие функции в модуле, который называется «firstModule.py»:Python потоков и глобальные вары

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 

Basica lly Я хочу, чтобы значение «addCount» в обоих модулях было одним из «mainModule». После этого, когда потоки закончены, я хочу напечатать значение «a» в обоих из них. Приведенный выше пример не работает. Мне было интересно, как я могу это исправить.

ответ

2

Модули в python являются одноточечными, поэтому вы можете поместить свои глобальные переменные в модуль globalModule.py и иметь как firstModule, secondModule, так и mainModule import globalModule, и все они будут обращаться к одному и тому же addCount.

Однако, в целом, для потоков важно иметь глобальное состояние.

Это никогда не будет работать:

печати firstModule.a печатающую 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 
+0

ОК, теперь он работает, но я не могу установить глобальные переменные .. – Gavriel

4

Pass «addCount» в функции «вычислить», вернуть значение «а» «Calculate 'и присвойте ему новый атрибут в экземпляре MyThread.

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