2013-07-11 6 views
14

Ich habe eine Frage, kann Django Multithread funktioniert?Kann Django Multithread arbeiten?

Hier ist, was ich tun möchte: Klicken Sie auf eine Schaltfläche auf einer Webseite, dann gibt es einige Funktionen in model.py gestartet wird, zum Beispiel einige Daten aus dem Internet zu crawlen, wenn sie fertig sind, kehrt es zum Benutzer zurück Ergebnisse.

Ich wundere mich, dass ich einen neuen Thread öffnen muss, um die Funktionen in model.py auszuführen, kann mir jemand sagen, wie es geht? Vielen Dank.

+0

Was Sie zu erreichen versuchen, ? vielleicht können Sie das durch Frontend-Technologien wie AJAX, WebSocket, Magic Pony ... – gipi

+0

Was ist Magic Pony? Kann es nicht auf Google finden ... –

Antwort

9
  1. Ja es Multi-Thread kann, aber man verwendet in der Regel Sellerie das Äquivalent zu tun. You can read about how in the celery-django tutorial.
  2. Es ist selten, dass Sie eigentlich wollen, um den Benutzer zu zwingen, auf die Website zu warten. Während es besser ist als riskiert eine Auszeit.

Hier ist ein Beispiel für das, was Sie beschreiben.

User sends request 
Django receives => spawns a thread to do something else. 
main thread finishes && other thread finishes 
... (later upon completion of both tasks) 
response is sent to user as a package. 

bessere Art und Weise:

User sends request 
Django receives => lets Celery know "hey! do this!" 
main thread finishes 
response is sent to user 
...(later) 
user receives balance of transaction 
+58

Sellerie ist Overkill für viele Zwecke. Bitte hör auf, es als Wundermittel für alles zu empfehlen, was die Anfrage/Antwort nicht blockieren muss. Es ist wie ein RDBMS zu empfehlen, wenn jemand fragt, wie man eine Textzeile speichert. –

+5

@andybak Fühlen Sie sich frei, eine Alternative vorzuschlagen. Das klingt für mich nach einem legitimen Einsatz. – cwallenpoole

+4

hängt von den Besonderheiten ab, aber Sie können nur einen Thread spawnen und zum Abschluss abfragen, Sie können einen einfachen Cron-Job verwenden, der nach Aufgaben sucht, oder wenn Sie mehr Funktionen benötigen, können Sie einen von mehreren "nicht so komplex wie Sellerie" verwenden Projekte wie Huey oder Django-Hintergrund-Aufgaben. –

0

Wenn Sie etwas Overkill Rahmen zu Ihrem Projekt nicht hinzufügen möchten, können Sie einfach subprocess.Popen:

def my_command(request): 
    command = '/my/command/to/run' # Can even be 'python manage.py somecommand' 
    subprocess.Popen(command, shell=True) 
    return HttpResponse(status=204)