Sellerie: Korrekter Weg, um langwierige Initialisierungsfunktion (pro Prozess) auszuführen

8

TLDR;

Um eine Initialisierungsfunktion für jeden von Sellerie erzeugten Prozess auszuführen, können Sie das Signal worker_process_init verwenden. Wie Sie in den Dokumenten nachlesen können, sollten Handler für dieses Signal dies nicht tun für mehr als 4 Sekunden blockieren. Aber was sind die Optionen, wenn ich eine Init-Funktion ausführen muss, deren Ausführung mehr als 4 Sekunden dauert?

Problem

Ich verwende ein C-Erweiterungsmodul, um bestimmte Operationen innerhalb von Sellerie-Aufgaben auszuführen. Dieses Modul benötigt eine Initialisierung, die einige Sekunden dauern kann (vielleicht 4 - 10). Da ich diese Init-Funktion lieber nicht für jede Aufgabe, sondern für jeden erzeugten Prozess ausführen möchte, habe ich das worker_process_init -Signal verwendet:

%Vor%

Was passiert, wenn ich diesen Code ausführe, ist das, was ich in meiner früheren Frage beschrieben habe ( Sellerie: in unendlich wiederholende Timeouts stecken (Zeitüberschreitung beim Warten auf UP-Nachricht) ). Kurz gesagt: Da meine Init-Funktion länger als 4 Sekunden dauert, kommt es manchmal vor, dass ein Worker getötet und neu gestartet wird und während des Neustarts erneut getötet wird, da dies automatisch nach 4 Sekunden ohne Reaktion geschieht. Dies führt schließlich zu einem unendlichen wiederholten Kill-and-Restart-Prozess.

Eine andere Möglichkeit wäre, meine Init-Funktion nur einmal für jeden Worker auszuführen, indem ich das Signal worker_init verwende. Wenn ich das tue, bekomme ich ein anderes Problem: Jetzt hängen die eingereihten Prozesse aus irgendeinem Grund fest. Wenn ich den Arbeiter mit einer Nebenläufigkeit von 3 beginne und dann ein paar Aufgaben sende, werden die ersten drei fertig, die übrigen werden nicht berührt. (Ich nehme an, es könnte etwas damit zu tun haben, dass die client -Objekte zwischen mehreren Prozessen geteilt werden müssen und dass die C-Erweiterung dies aus bestimmten Gründen nicht unterstützt. Aber um ehrlich zu sein, bin ich relativ neu zu muli-processing, also kann ich nur raten)

Frage

Also bleibt die Frage: Wie kann ich eine Init-Funktion pro Prozess ausführen, die länger als 4 Sekunden dauert? Gibt es einen richtigen Weg dies zu tun und wie wäre das?

    
basilikum 13.06.2014, 10:06
quelle

1 Antwort

6

Sellerie-Grenzwerte für die Verarbeitung des Init-Timeouts auf 4,0 Sek. Überprüfen Sie den Quellcode

Um dieses Limit zu umgehen, können Sie es ändern, bevor Sie die Sellerie-App erstellen.

%Vor%

Beachten Sie, dass es keine Konfiguration oder Einstellung gibt, um diesen Wert zu ändern.

    
mrorno 17.07.2015 05:46
quelle