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?
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. –
@JohnAnderson Dieses Verhalten ist Windows-spezifisch –