Wie zu verwenden .delay () - Methode in django-celery?
Den ich nutzen möchte .Verzögerung zu erreichen, das asynchrone Verhalten. Der Hauptgrund für die Verwendung dieser ist die Beschleunigung meiner Sicht. Mache ich das falsch? Wenn ja, wie soll ich es richtig machen?
Unten ist der Beispiel-code:
View.py
@cache_page(60*60*24)
def my_view(request):
something ..... .... ....
a = SomeModel.objects.get(pk=id)
data = celery_task.delay(a)
return dumpjson(status='ok', data=data, callback=callback)
Task.py
def celery_task(a):
res = request.get('http:sample.sample.com/feed/result' params={'abc': 'abc'})
return {'response': res}
Wenn ich die Antwort von celery_task zeigt es einige guid (1b52f519-64cb-43da-844a-2886bcccb9bc) und der Fehler ist so etwas wie dieses:
<EagerResult: 1b52f519-64cb-43da-844a-2886bcccb9bc> is not JSON serializable
InformationsquelleAutor fakhir hanif | 2014-03-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist verzögert die Funktion und den Aufruf asynchron. Daher zwangsläufig, der code nicht warten, bis es das Ergebnis. So, dass ist sozusagen der Punkt.
Also Sellerie starten
celery_task
im hintergrund, und Sie müssen etwas von dem zurückgeben an den client, ohne zu wissen, was das Ergebnis sein wird. Vielleicht, wenn die Aufgabe erledigt ist, kann es speichern Sie die Daten in eine Datenbank oder so, und das nächste mal, wenn der Benutzer geht auf die Seite, die Sie zeigen, können die fertigen Daten aus der Datenbank. Oder irgendetwas anderes.Was Sie wieder von
.delay
ist eine Art Griff, um die hintergrund-task. Man könnte.get()
auf (wenn ich mich Recht erinnere) und das wird hängen, bis Sie bekommt den Rückgabewert, aber dann sind Sie zurück nach Aufruf der Funktion synchron.Vielleicht, wenn der server läuft, dass Sellerie ist viel schneller als web-server, aber in der Regel wartet auf das Ergebnis ist nicht der Grund, warum Sie verwenden, Sellerie.
Was muss ich dann verwenden?
Sollten Sie nur tun, die rufen direkt an, wenn Sie nicht möchten, dass die Aufgabe asynchron ausführen. Es gibt einige overhead bei der Verwendung von Sellerie, was bedeutet, dass es läuft wie eine Aufgabe und warten auf das Ergebnis langsamer sein wird als nur das nennen einer regulären Funktion, die nicht die gleiche.
Eigentlich will ich führen Sie den task asynchron. Die Aufgabe umfasst ein externer Anschluss an den Dritten. Ich will diese Aufgabe ausführen, die parallel zu den anderen Prozessen.
InformationsquelleAutor RemcoGerlich
werden Sie nicht bekommen, um die zurückgegebenen Daten mit Verzögerung außer task-id verwenden Sie stattdessen http://docs.celeryproject.org/en/master/userguide/remote-tasks.html#enabling-the-http-task
InformationsquelleAutor Venkatesh Bachu