2 votes

django-celery Mise en file d'attente et récupération des résultats

Nous utilisons django-celery pour l'application. J'ai un doute concernant le flux de travail que nous suivons.

Actuellement, lorsqu'un utilisateur clique sur un lien, une tâche est mise en file d'attente à l'aide du code suivant

result=retrieveDatausingWorker.apply_async(args=[type,dictParamList]) 

Ensuite, la vue renvoie une page qui affiche un message d'attente à l'utilisateur. Cette page renvoie également l'identifiant de la tâche en cours. Puis, en utilisant un appel ajax qui envoie l'identifiant de la tâche au serveur, je vérifie l'état de la tâche actuellement en file d'attente.

code

def getDocketDownloaderWorkerStatus(request):

 if request.method=="POST":         

     task_id=request.POST.get('task_id')
     result = AsyncResult(task_id)
     if result:
         state, retval = result.state, result.result
         response_data = dict(id=task_id, status=state, result=safe_str(retval))            

     if (state=='SUCCESS' or state=='FAILURE') and ('task_id' in request.session):
         del request.session['task_id']             
     return HttpResponse(serialize(response_data), mimetype="application/json")

Cette fonction ajax sera appelée toutes les 5 secondes jusqu'à ce que le serveur renvoie le statut=='SUCCESS' avec le résultat.

Est-ce la bonne façon de faire ? Ou est-ce que cela coûte cher d'utiliser result = AsyncResult(task_id)

J'utilise la base de données comme courtier. La base de données est hébergée dans xeround cloud database. Lorsque je lance un travailleur, l'utilisation du CPU dépasse 95% et nous recevons un message d'erreur critique à ce sujet.

2voto

Wolph Points 28062

Vous utilisez la bonne méthode de vérification, l'utilisation de la base de données comme courtier n'est cependant pas vraiment recommandée.

Je vous recommande de passer à Redis ou RabbitMQ (RabbitMQ est probablement excessif dans votre cas). Cela devrait réduire considérablement l'utilisation du processeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X