Lange laufende Aufgaben mit Django

8

Mein Ziel ist es, eine Anwendung zu erstellen, die in der Lage ist, hauptsächlich Systemaufgaben zu übernehmen, wie zum Beispiel:

  • Auschecken von Code aus den Repositories,
  • Kopieren von Verzeichnissen zwischen verschiedenen Lokalisierungen,
  • usw.

Das Problem ist, dass ich es irgendwie unabhängig vom Webbrowser vorbereiten muss. Ich meine, dass zum Beispiel nach dem Start der Auscheck- / Kopieraktion, das Schließen des Webbrowsers die Aktion nicht unterbricht. Nachdem ich auf diese Seite zurückgekehrt bin, kann ich sehen, dass das Kopieren fortgesetzt wird oder eine andere Aktion gestartet wurde, als der Browser geschlossen wurde ...

Ich habe verschiedene Tools wie RabbitMQ + Sellerie, Twisted, Pyro, XML-RPC durchsucht, aber ich weiß nicht, ob diese für mich geeignet sind. Hat jemand ähnliche Bedürfnisse beim Erstellen der Django-App festgestellt? Bitte lassen Sie mich wissen, ob es Methoden / Pakete gibt, die ich kennen sollte. Codebeispiele sind ebenfalls mehr als willkommen!

Vielen Dank im Voraus für Ihre Vorschläge!

(Und tut mir leid für mein schlechtes Englisch. Ich arbeite daran.)

    
user1029968 04.11.2011, 15:46
quelle

3 Antworten

6

Grundsätzlich müssen Sie einen Prozess haben, der außerhalb der Anfrage läuft. Der einfachste Weg (zumindest auf einem Unix-ähnlichen Betriebssystem) ist fork() :

%Vor%

Das hat allerdings einige Nachteile (zB wenn der Server abstürzt, wird das "lange Ding" verloren gehen) ... Wo kann man, zum Beispiel, Sellerie als nützlich erweisen? Es verfolgt die Jobs, die erledigt werden müssen, die Ergebnisse der Jobs (Erfolg / Fehler / was auch immer) und erleichtert die Ausführung der Jobs auf anderen Maschinen.

Die Verwendung von Sellerie mit einem Redis-Backend (siehe Kombus Redis-Transport) ist sehr einfach, daher würde ich empfehlen, zuerst dort nachzusehen.

    
David Wolever 04.11.2011, 15:57
quelle
3

Möglicherweise müssen Sie einen Prozess außerhalb des Anfrage / Antwort-Zyklus haben. Wenn das der Fall ist, ist Sellerie mit einem Redis-Backend das, was ich vorschlagen würde, um zu prüfen, wie sich das gut mit Django integriert (wie David Wolever vorgeschlagen hat).

Eine weitere Möglichkeit besteht darin, Django-Verwaltungsbefehle zu erstellen und dann cron zu verwenden Führe sie in geplanten Intervallen aus.

    
Brian Neal 04.11.2011 16:25
quelle
1

Ok, ich konnte Warteschlangenmechanismen mit beiden Fällen einrichten:

  • Django-Tische (mit Django-Sellerie + Django-Kombu) mit:

    %Vor%
  • redis (mit Django-Sellerie) mit:

    %Vor%

und ich habe drei weitere Fragen dazu:

  1. WIE sollte ich diesen Warteschlangenmechanismus in meinem Projekt verwenden, wo ich in der Lage sein muss, einige Ausgabe-Logs in der Zeit zu erstellen, einen mehrstufigen Prozess fortzusetzen und die generierten Logs anzeigen zu können (von Anfang an) ) für den Benutzer, auch wenn er den Webbrowser während des Vorgangs wieder öffnet? Es tut mir leid, die Antwort ist nicht offensichtlich für mich ...

  2. Sollte ich redis config mit:

    verwenden %Vor%

    oder besser

    %Vor%

    in meinem Fall?

  3. Gibt es einen Unterschied zwischen der Verwendung von:

    %Vor%

    und

    %Vor%

    im ersten Fall? Ich kann keine sehen ...

Sieht so aus in 2. und 3. Ich kann hier nicht den Unterschied zwischen RESULT, TRANSPORT und BROKER feststellen. Vielen Dank im Voraus für Ihre Vorschläge!

    
user1029968 06.11.2011 01:12
quelle

Tags und Links