2

Ich bin ein Anfänger im Multiprocessing, kann mir jemand sagen, warum dies keine Ausgabe produziert?Keine Ausgabe von Process mit Multiprocessing

import multiprocessing 

def worker(num): 
    """thread worker function""" 

    print('Worker:', num) 

if __name__ == '__main__': 
    jobs = [] 

    for i in range(4): 
     p = multiprocessing.Process(target=worker, args=(i,)) 
     jobs.append(p) 
     p.start() 
+0

[scheint gut zu funktionieren.] (Https://ideone.com/jT84Ar) –

+0

Haben Sie Ihren Code interaktiv oder als Skript (zB 'Python myscript.py') laufen? – robyschek

+0

läuft wie ein Skript funktioniert. – user128751

Antwort

0

Sie müssen wahrscheinlich den Ausgang spülen. Sie können sys.stdout.flush() verwenden:

import multiprocessing 
import sys 

def worker(num): 
    """thread worker function""" 
    print('Worker:', num) 
    sys.stdout.flush() 
    return 

if __name__ == '__main__': 
    jobs = [] 
    for i in range(4): 
     p = multiprocessing.Process(target=worker, args=(i,)) 
     jobs.append(p) 
     p.start() 
+0

Das hat nicht geholfen! – user128751

+0

Sie können versuchen, es in die for-Schleife oder danach zu setzen - für mich funktioniert es ohne Flush. – rofls

+0

@ user128751 Wie läuft das Programm? Terminal, Interpreter, IDE? – rofls

1

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.

+0

läuft als ein Skript arbeiten, aber mit IDLE funktioniert es nicht. – user128751

+0

Sonderbare Sache. In ipython, wenn ich den ** Code mit Join ** nach dem ** Code ohne Join ** starte, werden die fehlenden Nachrichten aus dem ** Code ohne Join ** ebenfalls geleert. Es geht also nicht um vorzeitigen Ausstieg, sondern um Stdout-Caching in ipython. – robyschek

+0

Gefunden, sehe meine Bearbeitung! – Will