2013-09-05 8 views
7

Versuchen, eine gute Möglichkeit zu finden, eine Zeitüberschreitung von RQ Job zu fangen, so dass es nach der Zeitüberschreitung erneut aufgerufen werden kann.Wie können Sie RQ-Timeouts in Python korrekt erfassen und verarbeiten?

Grundsätzlich bietet die richtige Lösung einen Weg (z. B. einen Ausnahmebehandler im Worker oder etwas Ähnliches), um den Job, für den das Zeitlimit überschritten wurde, zurückzusetzen. Wenn der Job in die Warteschlange failed zurückkehrt, ist das auch eine gute Antwort.

Vielen Dank! Jede Hilfe wird geschätzt!

Antwort

3

Klingt, als ob Sie exception handling verwenden möchten. Aus der Dokumentation:

Aufträge können aufgrund von auftretenden Ausnahmen fehlschlagen. Wenn Ihre RQ-Mitarbeiter unter im Hintergrund laufen, wie werden Sie über diese Ausnahmen benachrichtigt?

Standardeinstellung: die fehlgeschlagene Warteschlange Das Standardsicherheitsnetz für RQ ist die fehlgeschlagene Warteschlange . Jeder Job, bei dem die Ausführung fehlschlägt, wird hier zusammen mit seine Ausnahmeinformationen (Typ, Wert, Traceback) gespeichert. Während dies macht sicher keine fehlerhaften Jobs "verloren gehen", ist dies nicht sinnvoll, um proaktiv über Job-Fehler benachrichtigt werden.

Benutzerdefinierte Ausnahmehandler Ab Version 0.3.1 unterstützt RQ , um benutzerdefinierte Ausnahmehandler zu registrieren. Dies macht es möglich, das Standardverhalten zu ersetzen (Senden des Jobs an die fehlgeschlagene Warteschlange) insgesamt, oder zusätzliche Schritte auszuführen, wenn eine Ausnahme auftritt.

Sie können auch speichern Arbeitsplätze in einem redis mit job_id als Schlüssel und time.time() + timeout als Partitur gesetzt sortiert und haben dann einen Arbeiter laufen ZRANGEBYSCORE sorted_set 0 [current_time] und Verfahren, was als timed-out Job zurückgegeben wird.

+2

Danke! Das ist richtig. Zukünftiger Bezug löst der Job eine "JobTimeoutException" aus, die vom Worker-Ausnahmehandler behandelt werden kann, wie auch immer Sie ihn definieren. –