Sellerie task-Status immer anhängig
Ich bin ziemlich neu auf Sellerie und django im Allgemeinen, so bitte entschuldigen Sie meinen Mangel an wissen. Ich bin versucht zu laufen, ein test, um zu tun einige Berechnungen und warten, bis der test abgeschlossen, so dass ich sicherstellen kann, ist es für die richtigen Antworten.
Hier ist was ich habe:
In app/tests.py
from tasks import *
c = calculate.apply_async(args=[1])
# wait until the task is done
while not calculate.AsyncResult(c.id).status == "SUCCESS":
print c.state
pass
in app/tasks.py
from celery import shared_task
@shared_task
def calculate(proj_id):
#some calculations followed by a save of the object
Den Zustand nie ändert sich von "pending", obwohl in der Sellerie-log heißt es, dass die Aufgabe erfolgreich abgeschlossen wurde
[2014-06-10 17:55:11,417: INFO/MainProcess] Received task: app.tasks.calculate[1f11e7ab-0add-42df-beac-3d94c6868aac]
[2014-06-10 17:55:11,505: INFO/MainProcess] Task app.tasks.calculate[1f11e7ab-0add-42df-beac-3d94c6868aac] succeeded in 0.0864518239978s: None
Habe ich auch CELERY_IGNORE_RESULT = False in der mainapp/settings.py, aber dieses scheint nicht, etwas zu tun.
Test-code, den Sie haben, ist richtig, das problem muss irgendwo in den Einstellungen oder die gesamte Einrichtung nehme ich an, wo genau, kann ich nicht sagen ohne mehr Infos.
Hier sind die Einstellungen, die ich mir bewusst bin, wenn ich etwas vermissen lassen Sie es mich bitte wissen. celery.py und _init.py Folgen Sie der Anleitung Konventionen und hier ist, was ich in mainapp/settings.py:
Wie haben Sie beantwortet meine ursprüngliche Frage habe ich verschoben, die andere Frage zu einem geeigneten Platz in einem anderen Beitrag. Wenn Sie möchten, weiter zu helfen, finden Sie es here
Hier sind die Einstellungen, die ich mir bewusst bin, wenn ich etwas vermissen lassen Sie es mich bitte wissen. celery.py und _init.py Folgen Sie der Anleitung Konventionen und hier ist, was ich in mainapp/settings.py:
BROKER_URL = "amqp://the ipadress" CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend' CELERY_ACCEPT_CONTENT = ['json','pickle','msgpack','yaml'] CELERY_IGNORE_RESULT = False
Wie haben Sie beantwortet meine ursprüngliche Frage habe ich verschoben, die andere Frage zu einem geeigneten Platz in einem anderen Beitrag. Wenn Sie möchten, weiter zu helfen, finden Sie es here
InformationsquelleAutor DoctorWizard | 2014-06-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, Ihre Einstellungen sind falsch. 🙂 Sie brauchen auch die Einrichtung eines broker für Sellerie zu arbeiten.
Zunächst
djcelery
ist veraltet, alles ist enthalten incelery
für die Arbeit mitdjango
.Zweite von all, setzen Sie nicht alle Inhalte akzeptiert werden, es kann ein mögliches Sicherheitsrisiko. Verwenden
pickle
nur im Falle, dass einfachejson
ist nicht genug (lassen Sie uns sagen, Sie übergeben, Funktionen oder Objekte als Argumente an Aufgaben, oder Rückkehr von Aufgaben)Also meine Vermutung ist, Sie wollen einfach nur den Sellerie aus, das ist, warum Sie versuchen, zu verwenden Datenbank-backend, das ist in Ordnung, aber für den produktiven Einsatz würde ich empfehlen, mit RabbitMQ.
In jedem Fall, versuchen Sie es mit diesen Einstellungen:
führen
python manage.py syncdb
Nur, damit Sie wissen, ich habe nicht verwendet-Datenbank als Makler oder Ergebnis backend, also setup ist unvollständig, oder sogar falsch sind, aber versuchen Sie es sowieso.
mehr
CELERY_RESULT_BACKEND
- Einstellung für die Datenbank-BeispieleIn Fall, dass Sie wollen, um das setup RabbitMQ als Makler-backend, das würde ich empfehlen und ich weiß sicher, dass es funktionieren wird:
wenn es auf ubuntu laufen:
Konfigurieren Sie dann die Sellerie in
settings.py
:Lassen Sie mich wissen, wie es geht.
Gut, das ist gut, das bedeutet, dass Sellerie ist, zu arbeiten. Posten Sie Ihre Aufgabe, code und error, ich werde Ihnen sagen, wo das problem herkommt.
Sie können auch verwenden
c = calculate.delay(1, foo=2)
stattc = calculate.apply_async(args=[1], kwargs={'foo':2})
wenn Sie nur wollen, um es auf Warteschlange statt der Disposition zu einer bestimmten Zeit oder müssen, geben Sie eine beliebige benutzerdefinierte Verhalten.Ich kann nicht nach dem code, in seiner Gesamtheit aber ich kann nach einigen.
@shared_task def calculate(project_id): project = Project.objects.get(project=project_id) for part in project.part_set.all(): partCalculate(part.id) p = Part.objects.get(id=part.id) #add various things to the project project.save() def partCalculate(part_id): part = Part.objects.get(id=part_id) #initalize various lists for p in part.subpart_set.all(): # put stuff in lists if any(of the values above): #some statistics stuff part.save()
[INFO/MainProcess] Received task: measuring.tasks.calculate[id] [ERROR/MainProcess] Task measuring.tasks.calculate[id] raised unexpected: ValueError('task args must be a list or tuple',) Traceback: File "/celery/app/trace.py", line 240, in trace_task R = retval = fun(*args, **kwargs) File "/celery/app/trace.py", line 437, in __protected_call__ return self.run(*args, **kwargs) File "/calculate/tasks.py", line 28, in calculate p = Part.objects.get(id=part.id) File "/python2.7/site-packages/celery/app/task.py", line 555, in apply_async
InformationsquelleAutor lehins
Gerade vom doc: Ergebnis backend funktioniert nicht, oder die Aufgaben werden immer in PENDING Zustand.
Alle Aufgaben sind
PENDING
standardmäßig, so dass der Staat besser gewesen wäre, mit dem Namen "unbekannt". Sellerie nicht aktualisieren-Status, wenn eine Aufgabe gesendet, und jede Aufgabe, mit der Geschichte wird davon ausgegangen, dass ausstehende (Sie kennen die Aufgabeid
nachdem alle).Stellen Sie sicher, dass die Aufgabe nicht
ignore_result
aktiviert.Durch aktivieren dieser option zwingt die Arbeiter zu überspringen Aktualisierung Staaten.
Stellen Sie sicher, dass die
CELERY_IGNORE_RESULT
Einstellung ist nicht aktiviert.Stellen Sie sicher, dass Sie nicht alle alten Arbeiter, der noch läuft.
Es ist leicht zu starten mehrere Arbeitnehmer durch einen Unfall, so stellen Sie sicher, dass der frühere Arbeitnehmer ordnungsgemäß Herunterfahren, bevor Sie ein neues beginnen.
Einen alten Arbeiter, der nicht konfiguriert ist, mit dem erwarteten Ergebnis backend ausgeführt werden kann, und ist die Entführung der Aufgaben.
Den
–pidfile
argument kann festgelegt werden, um einen absoluten Pfad, um sicherzustellen, dass dies nicht passiert.Stellen Sie sicher, dass der client konfiguriert ist, mit der richtigen backend.
Wenn aus irgendeinem Grund, den der client konfiguriert ist, verwenden Sie ein anderes backend als der Arbeiter, werden Sie nicht in der Lage sein, um das Ergebnis zu erhalten, so stellen Sie sicher, dass die backend-richtig untersuchen:
Ich wechselte das backend von "rpc://" Datenbank, und dann den task-Status nicht mehr "PENDING".
Gibt es einen Grund, warum Tast-Staaten funktionieren nicht mit mehreren Mitarbeitern? kann ich dies umgehen?
InformationsquelleAutor noooooooob
Wenn Sie mit alten
django-celery
undRabbitMQ
als Ergebnis backend, dann sind diese Einstellungen vielleicht helfen:InformationsquelleAutor Denis Krumko