2016-04-15 17 views
0

Ich habe kürzlich Multiprocessing für Python entdeckt, also spiele ich ein bisschen damit herum und rannte gegen eine Wand.Python-Multiprozessing lehnt Schleife ab

Dies ist das Skript Ich arbeite mit:

import multiprocessing, time 

def p_def(): 
     print "running p" 
     time.sleep(5) 

def v_def(): 
     print "running v" 
     time.sleep(5) 

p = multiprocessing.Process(target=p_def) 
v = multiprocessing.Process(target=v_def) 

while True: 
     time.sleep(0.25) 
     p.start() 
     while p.is_alive() == True: 
       time.sleep(0.5) 
       print "waiting for it to finish" 

Alle funktioniert gut, wenn ich den Code ausführen, startet er den p_def, aber wenn es fertig ist und will es wieder laufen, läuft es in eine snag und gibt mir diesen Fehler aus:

running p 
waiting for it to finish 
waiting for it to finish 
waiting for it to finish 
waiting for it to finish 
waiting for it to finish 
waiting for it to finish 
waiting for it to finish 
waiting for it to finish 
waiting for it to finish 
waiting for it to finish 
Traceback (most recent call last): 
    File "proc.py", line 19, in <module> 
    p.start() 
    File "/usr/lib/python2.7/multiprocessing/process.py", line 120, in start 
    assert self._popen is None, 'cannot start a process twice' 
AssertionError: cannot start a process twice 

Das scheint mir ein wenig seltsam. Mein Verständnis sagt, dass es in der Lage sein sollte, es wieder zu laufen, obwohl, was ich online sehe, Leute sagen, dass es dasselbe zweimal nicht laufen kann.

Was ist die Wahrheit und wie kann ich es zweimal laufen lassen?

+0

nicht direkt auf die Frage bezogen, sondern statt Besetzt warten auf den Prozess zu beenden, können Sie (und wahrscheinlich sollte) verwenden, um die 'p.join()' Funktion. –

Antwort

2

Sie müssen das Objekt p neu erstellen, ein Prozess kann nur einmal gestartet werden. (https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process.start)

import multiprocessing, time 

def p_def(): 
     print "running p" 
     time.sleep(5) 

def v_def(): 
     print "running v" 
     time.sleep(5) 

v = multiprocessing.Process(target=v_def) 

while True: 
     time.sleep(0.25) 
     p = multiprocessing.Process(target=p_def) 
     p.start() 
     while p.is_alive() == True: 
       time.sleep(0.5) 
       print "waiting for it to finish" 
Verwandte Themen