Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Gestion d'un workflow en Django

+3 votes
Je viens de debarquer sur un projet Django ou il y a pas mal de taches asynchrones (taches celery et twisted notamment),

Et pour enchainer les differentes logiques metier, ils utilisent les signaux de Django (voire le chain() de celery de temps en temps si c'est pour enchainer 2 taches celery).

Ca devient du coup, au fur et a mesure, un joli tas de spaghetti ou un nouveau code ajoute va peut etre lui aussi attendre un signal et en emettre un autre.

J'ai toujours ete un peu reticent a l'usage massif des signaux, notamment a cause de la difficulte a debugguer en cas de soucis.

Je voulais savoir si vous aviez deja eu ce genre de choses a gerer, et si oui, est-ce que vous avez essaye de tester des apps du genre django-kolibri (https://pypi.python.org/pypi/Kolibri/) ou django-viewflow (http://viewflow.io/) pour pouvoir definir precisement le workflow de l'application ?
demandé 1-Jan-2015 par romgar (130 points)
edité 1-Jan-2015 par max
On ne peut pas vraiment répondre à cette question, tout ce que tu auras, ce sont des avis. De notre côté, on utilise rien de tel en tout cas.
Et du coup, ce n'est pas trop l'idee du site de poser des questions du style ?
Je n'attendais justement que des avis et peut-etre des retours d'experiences.
C'est plus le job d'un forum. Mais les SO like ont la notion de "réponse acceptée" qui rend le truc très efficace : si quelque recherche une réponse, il a de grande chance d'avoir une "réponse acceptée" juste sous la question. Avec des questions aussi ouverte, il ne peut pas y avoir de "réponse acceptée". Après, on ne va pas interdire ce genre de questions pour le moment, vu qu'il n'y a personne sur le site, ça ne créé pas beaucoup de bruit. Mais à mon avis c'est pas l'idéal.
C'est note !!

Je viens de regarder de plus pres viewflow et ca me fait penser clairement à django formwizard. C'est pas tout à fait la meme chose mais on peut facilement choisir un chemin différent, si besoin, en cours de route, et dynamiquement en plus. Sinon viewflow à l'air très propre à mettre en oeuvre.

Selon une suggestion faite sut twitter il y a :

Xworkflows :
http://tech.novapost.fr/python-xworkflows-et-django-xworkflows.html

Si la solution te convient, fais toi en une réponse que tu te valides.

1 Réponse

+5 votes
 
Meilleure réponse

Pour ma part, j'ai toujours évité d'utiliser les signaux pour les tâches asynchrones avec Django, car Django lance les signaux de manières synchrones.

L'architecture que j'utilise dès lors qu'il y a des workers est la suivante:

Schéma de délégation des tâches asynchrone à des workers

Le schéma part d'un système de génération des previews d'un document.
Lors de l'upload une tâche est ajoutée dans la liste des tâches via un appel API (Il s'agit d'un call HTTP mais ca peut-être un call RabbitMQ ou redis directement)

Ensuite les workers se pluggent sur la liste des tâches (BLPOP redis ici)
Dès qu'une tâche est ajoutée elle est consommée par un des workers. (Il y a même moyen avec AWS d'avoir du scalling automatique du nombre de worker en fonction de l’accélération du remplissage de la queue.)

Une fois la tâche terminée, la mise à jour dans la DB s'effectue via un call API sur l'appli Django.

Ainsi plus d'histoire de signaux, plus de Celery (qui est un truc infâme à debugger il faut bien le dire)

  • L'appli Django ne s'occupe que de faire la gestion des appels HTTP
  • Les workers s'occupent d'une tâche simple asynchrone

De plus les workers peuvent être codés dans différents langages (Go, C/C++, Java, Python, Node) ce qui est très pratique.

Si les tâches ne doivent pas échouer, il vaut mieux utiliser rabbitmq pour son système d'acknowledgement sinon redis fonctionne super bien pour ça.

répondu 28-Jan-2015 par Natim (162 points)
edité 28-Jan-2015 par foxmask

Je suis très intéressé par une démonstration technique de ton exemple, je suis exactement dans le même cas de figure où à la sauvegarde je veux enregistrer un historique des modifications de manière asynchrone. Actuellement je le fais en utilisant Celery mais c'est effectivement un peu overkill.

Si tu es à FOSDEM on peut s'organiser ça.

Sinon tu peux aussi regarder : https://github.com/novapost/insight-reloaded

...