Le céleri état de la tâche toujours en attente
Je suis assez nouveau dans le céleri et django en général, donc veuillez excuser mon manque de connaissances. Je suis en train d'exécuter un test pour faire quelques calculs et d'attendre le test pour terminer ce que je peux vous assurer qu'il est fait pour les réponses correctes.
Voici ce que j'ai:
Dans 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
dans app/tasks.py
from celery import shared_task
@shared_task
def calculate(proj_id):
#some calculations followed by a save of the object
L'état ne change jamais de "préparation", même si dans le céleri journal il est dit que la tâche a été achevée avec succès
[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
J'ai aussi mis CELERY_IGNORE_RESULT = False dans le mainapp/settings.py mais cela ne semble pas faire quoi que ce soit.
Test de code est correct, le problème doit être quelque part dans les paramètres ou sur l'ensemble de l'installation je suppose, où, exactement, je ne peux pas dire sans plus d'info.
Voici les paramètres que je suis au courant, si j'ai raté quelque chose s'il vous plaît laissez-moi savoir. celery.py et _init.py suivre le tutoriel conventions et voici ce que j'ai dans mainapp/settings.py:
Comme vous l'avez répondu à ma question d'origine, j'ai déplacé la question à un endroit plus approprié dans un autre post. Si vous souhaitez continuer à aider vous pouvez le trouver here
Voici les paramètres que je suis au courant, si j'ai raté quelque chose s'il vous plaît laissez-moi savoir. celery.py et _init.py suivre le tutoriel conventions et voici ce que j'ai dans 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
Comme vous l'avez répondu à ma question d'origine, j'ai déplacé la question à un endroit plus approprié dans un autre post. Si vous souhaitez continuer à aider vous pouvez le trouver here
OriginalL'auteur DoctorWizard | 2014-06-10
Vous devez vous connecter pour publier un commentaire.
Vos paramètres sont incorrects. 🙂 Vous devez également configurer un courtier pour le céleri à travailler.
Tout d'abord,
djcelery
est obsolète, tout est inclus danscelery
pour qu'il fonctionne avecdjango
.Deuxième de tous, ne définissez pas tout le contenu pour être accepté, il peut être un risque de sécurité potentiel. Utilisation
pickle
seulement dans le cas simplejson
n'est pas suffisant (disons que vous passez des fonctions ou des objets comme arguments pour les tâches, ou de retour de tâches)Si ma conjecture est, vous essayez juste de céleri, c'est pourquoi vous essayez d'utiliser la base de données back-end, ce qui est bien, mais pour une utilisation en production, je vous conseille d'utiliser RabbitMQ.
En tout cas, lui donner un essai avec ces paramètres:
puis exécutez
python manage.py syncdb
Juste pour que vous le savez, je n'ai pas utilisé de base de données comme un courtier ou d'un résultat en arrière-plan, d'où le programme d'installation peut être incomplète, voire erronée, mais essayer de toute façon.
plus de
CELERY_RESULT_BACKEND
pour la base de données des exemplesDans le cas où vous souhaitez configurer RabbitMQ en tant que courtier en arrière-plan, que je recommande et que je sais pour sûr que cela va fonctionner:
si sur ubuntu exécuter:
Ensuite configurer le céleri dans
settings.py
:Permettez-moi de savoir comment il va.
Eh bien, c'est une bonne chose, cela signifie que le céleri est de travail. Postez votre code de la tâche et de l'erreur, je vais vous dire d'où vient le problème.
Vous pouvez également utiliser
c = calculate.delay(1, foo=2)
au lieu dec = calculate.apply_async(args=[1], kwargs={'foo':2})
si vous voulez juste de le mettre sur la file d'attente à la place de la planification à l'heure ou à spécifier un comportement personnalisé.Je ne peux pas poster le code dans son intégralité, mais je peux poster quelques.
@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
OriginalL'auteur lehins
Directement à partir de la doc: Résultat backend n'est pas le travail ou les tâches sont toujours en ATTENTE de l'état.
Toutes les tâches sont
PENDING
par défaut, de sorte que l'état aurait été mieux nommé "inconnu". Le céleri ne met pas à jour tout état lorsqu'une tâche est envoyée, et n'importe quelle tâche sans histoire est supposé être en attente (vous savez la tâcheid
après tout).Assurez-vous que la tâche n'a pas
ignore_result
activé.Cette option permet de forcer le travailleur à ignorer la mise à jour des états.
Assurez-vous que le
CELERY_IGNORE_RESULT
paramètre n'est pas activé.Assurez-vous que vous n'avez pas n'importe quel vieux travailleurs encore en cours d'exécution.
Il est facile de démarrer plusieurs travailleurs par accident, alors assurez-vous que la précédente travailleur est correctement arrêt avant de commencer un nouveau.
Un ancien travailleur qui n'est pas configuré avec le résultat attendu backend peut être en cours d'exécution et le détournement de l'tâches.
La
–pidfile
argument peut être un chemin absolu pour s'assurer que cela ne se produise pas.Assurez-vous que le client est configuré avec le droit backend.
Si, pour une raison quelconque, le client est configuré pour utiliser un autre backend que le travailleur, vous ne serez pas en mesure de recevoir le résultat, donc assurez-vous que le backend est correct en l'inspectant:
J'ai changé le backend de "rpc://" à la base de données, puis de l'état de la tâche est plus "en ATTENTE".
Est-il une raison pourquoi Tast États ne fonctionnent pas avec plusieurs travailleurs? puis-je contourner cela?
OriginalL'auteur noooooooob
Si vous utilisez une ancienne
django-celery
etRabbitMQ
comme résultat backend, ces paramètres peuvent aider:OriginalL'auteur Denis Krumko