2017-10-18 18 views
2

j'ai essayé d'exécuter le code multitraitement suivant:multitraitement Ne pas tenir Résultats

import multiprocessing 

class test(multiprocessing.Process): 
    def __init__(self, name): 
     multiprocessing.Process.__init__(self) 
     self.name = name 
     self.finished = False 

    def run(self): 
     print("executed") 
     self.finished = True 

test_list = [] 
test_list.append(test('first')) 
test_list.append(test('second')) 

for t in test_list: 
    t.start() 

for t in test_list: 
    t.join() 

for t in test_list: 
    print(t.finished) 

et obtenir les résultats:

executed 
executed 
False 
False 

Les sorties False semblent étranges. J'ai mis l'attribut finished à True dans la méthode run, et les sorties executed montrent que la méthode run a été exécutée. Et, si j'ajoute une ligne print(self.finished) immédiatement après self.finished=True dans la méthode run, la sortie serait True. Pourquoi l'attribut de classe finished change-t-il après la fin du multitraitement?

Merci!

+0

t.finish est mis à jour dans un autre processus, et non dans le processus principal. Voir: https://docs.python.org/3/library/multiprocessing.html#sharing-state-between-processes – gammazero

Répondre

0

Cela vous permettra de partager la valeur finale entre les processus. Il utilise un multiprocessing.Value pour créer un objet partagé à l'aide de la mémoire partagée.

from multiprocessing import Process, Value 

class test(Process): 
    def __init__(self, name, fin): 
     Process.__init__(self) 
     self.name = name 
     self.finished = fin 

    def run(self): 
     print("executed") 
     self.finished.value = True 

test_list = [] 
test_list.append(test('first', Value('b', False))) 
test_list.append(test('second', Value('b', False))) 

for t in test_list: 
    t.start() 

for t in test_list: 
    t.join() 

for t in test_list: 
    print(bool(t.finished.value)) 
+0

Cela fonctionne, merci! – Craig

1

Le self.finished = True s'exécute dans un autre processus et modifie uniquement la variable dans ce processus, mais vous imprimez la valeur à partir du processus principal. Vous avez besoin de variables qui sont partagées.

from multiprocessing import Process,Value 
from ctypes import c_bool 

class test(Process): 
    def __init__(self,name): 
     super().__init__() 
     self.name = name 
     self._finished = Value(c_bool,False) 

    def run(self): 
     print(self.name,'executed') 
     self._finished.value = True 

    @property 
    def finished(self): 
     return self._finished.value 

if __name__ == '__main__': 
    test_list = [test('first'), 
       test('second')] 

    for t in test_list: 
     t.start() 

    for t in test_list: 
     t.join() 

    for t in test_list: 
     print(t.finished)