2017-05-23 7 views
3

Ich habe eine Funktion in meinem Django views.py, die so aussieht.Threading in Django funktioniert nicht in der Produktion

def process(request): 
form = ProcessForm(request.POST, request.FILES) 
if form.is_valid(): 
    instance = form.save(commit=False) 
    instance.requested_by = request.user 
    instance.save() 
    t = threading.Thread(target=utils.background_match, args=(instance,), kwargs={}) 
    t.setDaemon(True) 
    t.start() 
    return HttpResponseRedirect(reverse('mart:processing')) 

Hier Ich versuche, eine Funktion ‚background_match‘ zu nennen in einem separaten Thread, wenn Prozessformular vorgelegt. Da dieser Thread einige Zeit in Anspruch nimmt, leite ich den Benutzer auf eine andere Seite namens "mart: processing" um.

Das Problem, mit dem ich konfrontiert bin, ist, dass alles in meinem lokalen Computer funktioniert, aber nicht auf Produktionsserver, der eine AWS EC2-Instanz ist. Der Thread startet überhaupt nicht. Innerhalb der Funktion background_match gibt es eine for-Schleife, die sich nicht vorwärts bewegt.

Wenn ich jedoch die Seite 'mart: processing' aktualisiere (STRG + R), verschiebt es sich um 1 oder 2 Iterationen. Für eine vollständige Schleife, die aus 1000 Iterationen besteht, muss ich also die Seite 1000 Mal aktualisieren. Wenn ich nach etwa 100 Iterationen die Seite nicht aktualisiere, bleibt sie an diesem Punkt stecken und bewegt sich nicht zur 101. Iteration. Bitte helfen Sie!

+0

Verwenden Sie in der Produktion uwsgi und runserver vor Ort? – user14717

Antwort

1

Falsche Architektur. Django und andere Web-Apps sollten solche Threads erzeugen. Die korrekte Methode besteht darin, eine asynchrone Task mithilfe einer Taskwarteschlange zu erstellen. Die beliebteste Aufgabenwarteschlange für Django ist Celery.

Die Seite mart:processing sollte dann das asynchrone Ergebnis prüfen, um festzustellen, ob die Aufgabe abgeschlossen wurde. Eine grobe Skizze ist wie folgt.

from celery.result import AsynResult 
from myapp.tasks import my_task 

... 
if form.is_valid(): 
    ... 
    task_id = my_task() 
    request.session['task_id']=task_id 
    return HttpResponseRedirect(reverse('mart:processing')) 
    ... 

auf der nachfolgenden Seite

task_id = request.session.get('task_id') 
if task_id: 
    task = AsyncResult(task_id) 
+0

Wie überprüfe ich das asynchrone Ergebnis auf der Seite mart: processing? – p0712

+0

Sehen Sie das Update, aber Sie müssen diese Seite vollständig lesen, bevor Sie fortfahren – e4c5

+0

und wenn es eine falsche Architektur ist, dann funktioniert es einwandfrei auf meinem lokalen Rechner> – p0712

Verwandte Themen