2012-06-26 3 views
12

Можно создать дубликат:
Python multiprocessing global variable updates not returned to parentGlobals переменные и Python многопроцессорной

Я использую компьютер с большим количеством ядер и преимущества в производительности я действительно использовать больше чем один. Тем не менее, я запутался, почему эти биты кода не делать то, что я ожидал:

from multiprocessing import Process 

var = range(5) 
def test_func(i): 
    global var 
    var[i] += 1 

if __name__ == '__main__': 
    jobs = [] 
    for i in xrange(5): 
     p = Process(target=test_func,args=(i,)) 
     jobs.append(p) 
     p.start() 

print var 

Как

from multiprocessing import Pool 

var = range(5) 
def test_func(i): 
    global var 
    var[i] += 1 

if __name__ == '__main__': 
    p = Pool() 
    for i in xrange(5): 
     p.apply_async(test_func,[i]) 

print var 

Я ожидаю, что результат будет [1, 2, 3, 4, 5] но результат [0, 1, 2, 3, 4].

Должна быть какая-то тонкость, которую мне не хватает при использовании глобальных переменных с процессами. Это даже путь, или я должен избегать попытки изменить переменную таким образом?

+0

Посмотрите на этот вопрос http://stackoverflow.com/questions/659865/python-multiprocessing-sharing-a-large-read-only-object-between-processes – 8bitwide

+0

Вы используете эти фрагменты кода из сценарий или выполнение внутри консоли Python? –

+1

Вы должны управлять своим списком с помощью диспетчера многопроцессорности. – mgilson

ответ

9

Если вы используете два отдельных процесса, то они не будут использовать одни и те же глобальные переменные. Если вы хотите передать данные между процессами, посмотрите на использование send и recv. Посмотрите на http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes для примера, подобного тому, что вы делаете.

Смежные вопросы