2016-09-29 3 views
1

Ich frage mich, ob es möglich ist, zu überprüfen, wie lange jeder Prozess dauert.
zum Beispiel gibt es vier Arbeiter und der Job sollte nicht mehr als 10 Sekunden dauern, aber einer der Arbeiter dauert mehr als 10 Sekunden. Gibt es eine Möglichkeit, eine Warnung nach 10 Sekunden und bevor der Prozess den Auftrag zu beenden.
Mein erster Gedanke ist die Verwendung von Manager, aber es scheint, ich habe warten, bis der Prozess abgeschlossen ist.
Vielen Dank.Python Multiprocessing - überprüfen Sie den Status der einzelnen Prozesse

+1

Unix oder Windows? –

+0

@alec_djinn Unix – galaxyan

Antwort

2

Ich habe diese Lösung mal gefunden (irgendwo hier in StackOverflow) und bin sehr glücklich damit.

Im Grunde verwendet es signal, um eine Ausnahme auszulösen, wenn ein Prozess mehr als erwartet dauert.

Alles, was Sie tun müssen, ist diese Klasse, um Ihren Code hinzuzufügen:

import signal 

class timeout: 

    def __init__(self, seconds=1, error_message='TimeoutError'): 
     self.seconds = seconds 
     self.error_message = error_message 

    def handle_timeout(self, signum, frame): 
     raise TimeoutError(self.error_message) 

    def __enter__(self): 
     signal.signal(signal.SIGALRM, self.handle_timeout) 
     signal.alarm(self.seconds) 

    def __exit__(self, type, value, traceback): 
     signal.alarm(0) 

Hier ist ein allgemeines Beispiel dafür, wie es funktioniert:

import time 

with timeout(seconds=3, error_message='JobX took too much time'): 
    try: 
     time.sleep(10) #your job 
    except TimeoutError as e: 
     print(e) 

In Ihrem Fall würde ich das hinzufügen mit einer Aussage zu dem Job, den Ihr Mitarbeiter ausführen muss. Dann fangen Sie die Ausnahme und Sie tun, was Sie für das Beste halten.

Alternativ können Sie in regelmäßigen Abständen überprüfen, ob ein Prozess am Leben ist:

timeout = 3 #seconds 
start = time.time() 
while time.time() - start < timeout: 
    if any(proces.is_alive() for proces in processes): 
     time.sleep(1) 
    else: 
     print('All processes done') 
else: 
    print("Timeout!") 
    # do something 
+0

Es scheint mir, Ihre Kontext-Management-Funktion wird die Arbeiterfunktion ändern. Es ist gut, aber meine Erwartung berührt nicht die Arbeiterfunktion. – galaxyan

+0

Es ändert nicht die Worker-Funktion in Bezug auf was es tut, obwohl Sie die Worker-Funktion unter der With-Anweisung einrücken müssen. Ich sehe kein besonderes Problem dabei, vielleicht in Ihrem Fall ist anders, wenn Sie Ihre tatsächliche Funktion veröffentlichen, kann ich versuchen, eine Arbeitsimplementierung davon mit 'mit Timeout' zu machen. –

0

können Sie prüfen, ob Prozess am Leben ist, nachdem Sie es zu verbinden versucht. Vergessen Sie nicht, das Zeitlimit zu setzen, sonst wartet es, bis der Job beendet ist.

ist hier einfaches Beispiel für Sie

from multiprocessing import Process 
import time 

def task(): 
    import time 
    time.sleep(5) 

procs = [] 

for x in range(2): 
    proc = Process(target=task) 
    procs.append(proc) 
    proc.start() 

time.sleep(2) 

for proc in procs: 
    proc.join(timeout=0) 
    if proc.is_alive(): 
     print "Job is not finished!" 
Verwandte Themen