Sie Ihre Process()
beginnen, aber nie warten auf sie zu vervollständigen, so die Ausführung Ihres Programms endet, bevor der Hintergrundprozess beendet. Versuchen Sie dieses, mit einem Aufruf an Process.join()
:
import multiprocessing
import sys
def worker(num):
"""thread worker function"""
print('Worker:', num)
sys.stdout.flush()
if __name__ == '__main__':
jobs = []
for i in range(4):
p = multiprocessing.Process(target=worker, args=(i,))
jobs.append(p)
p.start()
map(lambda p: p.join(), jobs)
Hier stellen wir map()
verwenden join()
in der jobs
Liste auf jeden Prozess zu nennen.
Hier ist ein Beispiel für diese Arbeiten:
In [127]: %paste
import multiprocessing
import sys
def worker(num):
"""thread worker function"""
print('Worker:', num)
sys.stdout.flush()
if __name__ == '__main__':
jobs = []
for i in range(4):
p = multiprocessing.Process(target=worker, args=(i,))
jobs.append(p)
p.start()
map(lambda p: p.join(), jobs)
## -- End pasted text --
Worker: 2
Worker: 1
Worker: 0
Worker: 3
In [128]:
Was, warum dies in IDLE nicht funktioniert, siehe this answer:
jedoch die print
Ausgabe zu sehen, zumindest unter Windows , man muss IDLE von einer Konsole aus starten.
C:\Users\Terry>python -m idlelib
hello bob
(Verwenden idlelib.idle
auf 2.x) Der Grund dafür ist, dass IDLE Benutzercode in einem getrennten Prozess ausgeführt wird. Derzeit erfolgt die Verbindung zwischen dem IDLE-Prozess und dem Benutzercode-Prozess über einen Socket. Die durch Multiprocessing vorgenommene Verzweigung dupliziert oder erbt die Socketverbindung nicht. Wenn IDLE über ein Symbol oder einen Explorer (in Windows) gestartet wird, kann die Druckausgabe nicht ausgeführt werden. Beim Starten von einer Konsole mit python
(statt pythonw
) wird die Ausgabe wie oben an die Konsole gesendet.
[scheint gut zu funktionieren.] (Https://ideone.com/jT84Ar) –
Haben Sie Ihren Code interaktiv oder als Skript (zB 'Python myscript.py') laufen? – robyschek
läuft wie ein Skript funktioniert. – user128751