web-dev-qa-db-fra.com

Variables globales et Python multiprocessing

Duplicata possible:
Les mises à jour des variables globales de multi-traitement Python ne sont pas retournées au parent

J'utilise un ordinateur avec de nombreux cœurs et pour des performances optimales, je devrais vraiment en utiliser plusieurs. Cependant, je ne comprends pas pourquoi ces morceaux de code ne font pas ce que j'attends:

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

Aussi bien que

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

Je m'attends à ce que le résultat soit [1, 2, 3, 4, 5] mais le résultat est [0, 1, 2, 3, 4].

Il doit y avoir une subtilité qui me manque dans l'utilisation des variables globales avec les processus. Est-ce même la voie à suivre ou dois-je éviter d'essayer de modifier une variable de cette manière?

16
user1475412

Si vous exécutez deux processus distincts, ils ne partageront pas les mêmes globaux. Si vous souhaitez transmettre les données entre les processus, regardez à l'aide de send et recv. Jetez un œil à http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes pour un exemple similaire à ce que vous faites.

11