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
Antwort
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
Es scheint mir, Ihre Kontext-Management-Funktion wird die Arbeiterfunktion ändern. Es ist gut, aber meine Erwartung berührt nicht die Arbeiterfunktion. – galaxyan
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. –
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!"
- 1. Python Multiprocessing: Prozesse starten nicht
- 2. Python Multiprocessing: So schließen Sie den Multiprocessing-Pool auf Ausnahme
- 3. Python Multiprocessing - JSON über mehrere Prozesse ändern
- 4. Überprüfen Sie den Status der FTP-Übertragung in Python
- 5. Python Multiprocessing starten mehr Prozesse als Kerne
- 6. Überprüfen Sie den Status der Schaltflächen-Kontrollkästchen
- 7. Multiprocessing in Python bei gleichzeitiger Begrenzung der Anzahl laufender Prozesse
- 8. Python Multiprocessing-Pool, für Prozesse warten und starten Sie benutzerdefinierte Prozesse
- 9. Multiprocessing: Mehr Prozesse als cpu.count
- 10. Python Multiprocessing vs Eventlet
- 11. Status des Mischens Multiprocessing und Threading in Python
- 12. Überprüfen Sie den Status von Raspberry Pi
- 13. Überprüfen Sie den Status von Sellerie Arbeiter
- 14. Python Multiprocessing: Kill Producer und Consumer-Prozesse mit KeyboardInterrupt
- 15. Überprüfen Sie den Login-Status in RouteProvider
- 16. Python MultiProcessing
- 17. Python Multiprocessing startet Prozesse, aber nur einer ist aktiv
- 18. Python-Multiprocessing für Prozesse, die separat gestartet werden
- 19. Systemd Einheit, überprüfen Sie den Status mit externen Skript
- 20. Überprüfen Sie den Status der verbundenen Bluetooth-Geräte
- 21. Überprüfen Sie den externen Link-Status vor der Aktualisierung
- 22. Überprüfen Sie den Status der Checkbox mithilfe von Robot Framework
- 23. Python Multiprocessing nicht
- 24. Multiprocessing/Multithreading in Python ..?
- 25. Python Multiprocessing Frage
- 26. Python itertools multiprocessing
- 27. Multiprocessing in Python blockiert
- 28. Überprüfen Sie den Antwortstatus -PYTHON
- 29. Python MultiProcessing Aktualisieren der globalen Variablen
- 30. Python Multiprozess Pool Prozesse zählen
Unix oder Windows? –
@alec_djinn Unix – galaxyan