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:
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?
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.
Tags und Links python celery initialization python-c-extension multiprocessing