71 votes

Comment utiliser un multiprocessing.Manager() ?

J'ai une inquiétude à propos de multiprocessing.Manager() en python. Voici l'exemple :

 import multiprocessing

def f(ns):
    ns.x *=10
    ns.y *= 10

if __name__ == '__main__':
    manager = multiprocessing.Manager()
    ns = manager.Namespace()
    ns.x = 1
    ns.y = 2

    print 'before', ns
    p = multiprocessing.Process(target=f, args=(ns,))
    p.start()
    p.join()
    print 'after', ns

et la sortie est :

 before Namespace(x=1, y=2)
after Namespace(x=10, y=20)

Jusqu'à présent, cela fonctionnait comme je m'y attendais, puis j'ai modifié le code comme ceci :

 import multiprocessing

def f(ns):
    ns.x.append(10)
    ns.y.append(10)

if __name__ == '__main__':
    manager = multiprocessing.Manager()
    ns = manager.Namespace()
    ns.x = []
    ns.y = []

    print 'before', ns
    p = multiprocessing.Process(target=f, args=(ns,))
    p.start()
    p.join()
    print 'after', ns

La sortie est maintenant :

 before Namespace(x=[], y=[])
after Namespace(x=[], y=[])

Cela me rend confus pourquoi les listes n'ont pas été modifiées comme je m'y attendais. Quelqu'un peut-il m'aider à comprendre ce qui s'est passé?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X