2014-02-21 8 views
8

Ich habe eine Django-Website, und eine Seite hat eine Schaltfläche (oder einen Link), die beim Anklicken eine etwas lange laufende Aufgabe startet. Offensichtlich möchte ich diese Aufgabe als Hintergrundaufgabe starten und sofort ein Ergebnis an den Benutzer zurückgeben. Ich möchte dies mit einem einfachen Ansatz umsetzen, bei dem ich keine komplett neue Messaging-Architektur wie Sellery installieren und lernen muss. Ich möchte Sellerie nicht verwenden! Ich möchte nur einen einfachen Ansatz verwenden, den ich einrichten und in der nächsten halben Stunde laufen lassen kann. Gibt es nicht eine einfache Möglichkeit, dies in Django zu tun, ohne (noch) ein drittes Paket hinzufügen zu müssen?Einfacher Ansatz zum Starten der Hintergrundaufgabe in Django

+0

Sie könnten den Server einfach eine Antwort vom Typ Request Received zurückgeben lassen. Dann, wenn Polling oder WebSockets keine Option sind, muss der Server nur einen prozentualen vollständigen Wert alle 10% oder 25% aktualisieren. Und haben einen bestimmten Bereich für den Benutzer, um alle laufenden Prozesse zu überprüfen, und zeigen Sie die Prozent abgeschlossen. Auf diese Weise trifft der Browser den Server nur, wenn der Benutzer die laufende Prozessseite aufruft oder aktualisiert. Wenn ein Prozess zu 100% abgeschlossen ist, haben Sie einen Link zu den Ergebnissen. Nur ein paar Ideen. –

+0

Hinweis: Der Server, der den Prozentabschluss aktualisiert, befindet sich nur auf dem Server [z. B. ein DB-Wert]. Dies kann abgefragt werden, wenn der Benutzer auf die angegebene Seite geht. Dies hängt auch davon ab, wie Ihre Infrastruktur gleichzeitige Verbindungen verarbeiten kann. Der laufende Prozess kann blockieren, so dass Sie möglicherweise in etwas wie Tornado suchen müssen. –

+1

Ich bezweifel * sehr * sehr, dass alles, was du schreibst, einfacher sein wird als nur Sellerie zu installieren und damit fertig zu werden. –

Antwort

4

Verwenden Sie einfach ein Gewinde.

import threading 

t = threading.Thread(target=long_process, 
          args=args, 
          kwargs=kwargs) 
t.setDaemon(True) 
t.start() 
return HttpResponse() 

Sehen Sie diese Frage für weitere Informationen: Can Django do multi-thread works?

5

Werfen Sie einen Blick auf django-background-tasks - es tut genau das, was Sie brauchen, und braucht daher nicht zusätzliche Dienste wie RabbitMQ oder Redis laufen. Er verwaltet eine Aufgabenwarteschlange in der Datenbank und verfügt über einen Django-Verwaltungsbefehl, den Sie einmal oder als Cron-Job ausführen können.

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/11499101) – Rao

+3

@Rao Der Link zeigt auf ein Modul, das das Problem löst, nicht eine Beschreibung, wie das Problem zu lösen ist. Ich würde nicht wissen, wie ich den Beitrag sonst noch umschreiben könnte, vielleicht hast du ein paar Tipps? – user226114

+0

Dieses Modul funktioniert derzeit nur mit Django 1.4 bis 1.8. – aboutaaron

Verwandte Themen