[Python] Transmission de valeurs pendant le multi-traitement

Laisser une note car la valeur n'a pas pu être transmise lors du passage de variables entre multi-processus Python

la mise en oeuvre

Définissez quatre fonctions (f1, f2, f3, f4) et exécutez chaque fonction dans un processus distinct. Chaque fonction ajoute une valeur et confirme la valeur ajoutée du dernier processus principal.

NG

La liste de test définie pour stocker les variables est un espace mémoire qui n'existe que dans le processus principal, il semble donc que les mises à jour de référence ne peuvent pas être effectuées à partir d'un autre processus.

--Programme

from multiprocessing import Process
from multiprocessing import Manager

testlist=[]
def f1():
    #print("function f1")
    testlist.append("f1")

def f2():
    #print("function f2")
    testlist.append("f2")

def f3():
    #print("function f3")
    testlist.append("f3")

def f4():
    #print("function f4")
    testlist.append("f4")

if __name__ == '__main__':
    for i in (0,1,2):
        p1 = Process(target=f1, args=())
        p1.start()
        p2 = Process(target=f2, args=())
        p2.start()
        p3 = Process(target=f3, args=())
        p3.start()
        p4 = Process(target=f4, args=())
        p4.start()

        p1.join()
        p2.join()
        p3.join()
        p4.join()
        p1.terminate()
        p2.terminate()
        p3.terminate()
        p4.terminate()
    print("")
    print("result: ",testlist)

--Résultat

result:  []

OK

Utilisez Manager pour transmettre des variables. Définissez la liste comme argument et passez les données entre les processus. Cela permet de mettre à jour la valeur de chaque fonction et de la vérifier à partir du processus principal.

--Programme

from multiprocessing import Process
from multiprocessing import Manager

def f1(dummy,testlist,num):
    #print("function f1")
    testlist.append("f1")

def f2(dummy,testlist,num):
    #print("function f2")
    testlist.append("f2")

def f3(dummy,testlist,num):
    #print("function f3")
    testlist.append("f3")

def f4(dummy,testlist,num):
    #print("function f4")
    testlist.append("f4")


if __name__ == '__main__':

    alllist=[]
    with Manager() as manager:
        for i in (0,1,2):
            d=manager.dict()
            l=manager.list([])
            p1 = Process(target=f1, args=(d,l,4*i+0))
            p1.start()
            p2 = Process(target=f2, args=(d,l,4*i+1))
            p2.start()
            p3 = Process(target=f3, args=(d,l,4*i+2))
            p3.start()
            p4 = Process(target=f4, args=(d,l,4*i+3))
            p4.start()


            p1.join()
            p2.join()
            p3.join()
            p4.join()
            p1.terminate()
            p2.terminate()
            p3.terminate()
            p4.terminate()
            alllist.extend(l)
    print("")
    print("result: ",alllist)

--Résultat

result:  ['f1', 'f2', 'f3', 'f4', 'f1', 'f2', 'f3', 'f4', 'f1', 'f2', 'f3', 'f4']

Recommended Posts

[Python] Transmission de valeurs pendant le multi-traitement
Python: valeurs Tips-Swap
UnicodeEncodeError: 'cp932' pendant le scraping Python
Échange de valeurs en Python
Python - Vérifiez le type de valeurs
Transférer les valeurs des paramètres en Python
Traitement parallèle Python (multitraitement et Joblib)
pip installer les erreurs de gestion de mysql pendant python
Gestion des exceptions lors de la communication de l'API Python
[Python] Comment permuter les valeurs de tableau
Exécuter le script Python pendant CodeSys # RunTime