2017-12-21 6 views
0

Ich lerne über parallele Verarbeitung in Python und ich habe einige sehr konkrete Zweifel hinsichtlich des Ausführungsflusses des folgenden Programms. In diesem Programm teile ich meine Liste je nach Prozess in zwei Teile. Mein Ziel ist es, die Add-Funktion zweimal parallel auszuführen, wobei ein Prozess einen Teil der Liste und ein anderer Teil einen anderen Teil übernimmt.Prozessablauf in paralleler Verarbeitung in Python

import multiprocessing as mp 
x = [1,2,3,4] 

print('hello') 
def add(flag, q_f): 
    global x 
    if flag == 1: 
     dl = x[0:2] 
    elif flag == 2: 
     dl = x[2:4] 
    else: 
     dl = x 
    x = [i+2 for i in dl] 
    print('flag = %d'%flag) 
    print('1') 
    print('2') 
    print(x) 
    q_f.put(x) 

print('Above main') 

if __name__ == '__main__': 
    ctx = mp.get_context('spawn') 
    print('inside main') 
    q = ctx.Queue() 
    jobs = [] 
    for i in range(2): 
     p = mp.Process(target = add, args = (i+1, q)) 
     jobs.append(p) 
    for j in jobs: 
     j.start() 
    for j in jobs: 
     j.join() 
    print('completed') 
    print(q.get()) 
    print(q.get()) 

print('outside main') 

Die Ausgabe, die ich habe ist

hello 
Above main 
outside main 
flag = 1 
1 
2 
[3, 4] 
hello 
Above main 
outside main 
flag = 2 
1 
2 
[5, 6] 
hello 
Above main 
inside main 
completed 
[3, 4] 
[5, 6] 
outside main 

Meine Fragen sind

1) Vom Ausgang, können wir sehen, dass ein Prozess zuerst ausgeführt wird immer, dann die andere. Verwendet das Programm tatsächlich mehrere Prozessoren für die parallele Verarbeitung? Wenn nicht, wie kann ich es parallel verarbeiten lassen? Wenn es Parallelverarbeitung war, sollten die Druckanweisungen ('1') gedruckt ('2') zufällig ausgeführt werden, oder?

2) Kann ich programmgesteuert überprüfen, auf welchem ​​Prozessor das Programm ausgeführt wird?

3) Warum werden die print-Anweisungen außerhalb von main (hallo, über main, outside main) dreimal ausgeführt?

4) Was ist der Ablauf der Programmausführung?

+0

1) Es kann sein, dass Ihr Code zu schnell ausgeführt wird (der erste Prozess wird beendet, bevor die zweite gestartet werden kann). 2) Nicht sicher. 3) Ich sehe die zusätzlichen Ausführungen von print-Anweisungen nicht, wenn ich Ihren Code ausführe. –

+0

@JohnAnderson Dieses Verhalten ist Windows-spezifisch –

Antwort

1

1) Die Ausführung von add() ist wahrscheinlich so schnell erledigt, dass die erste Ausführung bereits beendet wurde, als der zweite Prozess gestartet wurde.

2) Ein Verfahren, in der Regel ist nicht auf eine bestimmte CPU zugeordnet sind, sondern springt zwischen ihnen

3) Wenn Sie Windows verwenden für jede der Modul-Prozess gestartet erneut ausgeführt werden müssen. Für diese Ausführungen ist __name__ nicht 'main' sondern alle unconditional Befehle (außerhalb von if und so) wie diese print s ausgeführt werden.

4) Wenn start() ein Process unter Windows ein neues Python-Interpreter aufgerufen wird, gestartet wird, was bedeutet, dass die notwendige Module importiert werden (und damit ausgeführt) und die notwendigen Ressourcen, um die subprocess laufen auf die neuen Interpreter übergeben (die „Spawn Verfahren beschrieben in https://docs.python.org/3.6/library/multiprocessing.html#contexts-and-start-methods). Alle Prozesse laufen dann unabhängig voneinander (wenn keine Synchronisierung vom Programm ausgeführt wird)

+0

Vielen Dank. – VaM999