web-dev-qa-db-fra.com

Approche simple pour lancer une tâche en arrière-plan dans Django

J'ai un site Web Django, et une page a un bouton (ou un lien) qui, lorsque vous cliquez dessus, lancera une tâche relativement longue. Évidemment, je veux lancer cette tâche en tâche de fond et revenir immédiatement un résultat pour l'utilisateur. Je veux implémenter cela en utilisant une approche simple qui ne me demandera pas d'installer et d'apprendre une toute nouvelle architecture de messagerie comme Celery par exemple. Je ne veux pas utiliser Celery! Je veux juste utiliser une approche simple que je peux configurer et démarrer au cours de la prochaine demi-heure environ. N'y a-t-il pas un moyen simple de le faire dans Django sans avoir à ajouter (encore un autre) package tiers?

31
Marc

Si vous êtes prêt à installer une bibliothèque tierce, mais que vous voulez quelque chose de beaucoup plus simple que Celery, consultez Redis Queue. Cela nécessite Redis, ce qui est assez facile en soi, mais cela peut également offrir de nombreux autres avantages.

RQ lui-même a une configuration presque nulle. C'est incroyablement simple.

Références:

2
John Lehmann

Utilisez simplement un fil.

import threading

t = threading.Thread(target=long_process,
                            args=args,
                            kwargs=kwargs)
t.setDaemon(True)
t.start()
return HttpResponse()

Voir cette question pour plus de détails: Can Django do multi-thread works?

17
Benjamin Toueg

Jetez un œil à Django-background-tasks - il fait exactement ce dont vous avez besoin et n'a pas besoin de services supplémentaires pour fonctionner comme RabbitMQ ou Redis. Il gère une file d'attente de tâches dans la base de données et possède une commande de gestion Django que vous pouvez exécuter une fois ou en tant que tâche cron.

13
user226114