12
votes

Comment lancer au mieux une demande de travail asynchrone dans la vue Django?

Une de mes fonctions de vue est un travail de traitement très long et doit clairement être traité différemment. Au lieu de faire attendre l'utilisateur pendant longtemps, il serait préférable que je puissiez déjeuner le travail de traitement qui enverrait les résultats et sans attendre l'achèvement d'être achevé que leur demande est en cours de traitement et de les laisser naviguer. Je sais que je peux utiliser Os.fork, mais je me demandais s'il y a une «bonne façon» en termes de Django. Je peux peut-être retourner la réponse HTTP et continuer avec ce travail en quelque sorte?


3 commentaires

Dupliquer: Stackoverflow.com/Questtions/1352678/...


Mon mauvais, je pensais que je cherchais très bien!


Ne semble pas avoir une réponse simple cependant, malheureusement.


3 Réponses :


1
votes

Pourquoi ne pas simplement démarrer un thread pour faire le traitement, puis continuer à Envoyer la réponse?


0 commentaires

10
votes

Il y a quelques solutions à ce problème et le meilleur dépend un peu sur la taille de votre charge de travail.

Si vous avez une charge de travail de lumière, vous pouvez utiliser l'approche utilisée par Django-Mailer qui consiste à définir un modèle "Emplois", enregistrez de nouveaux travaux dans la base de données, puis faites-vous exécuter un script autonome de soi aussi souvent pour traiter les travaux stockés dans la base de données (en supprimant une fois terminé). Vous pouvez utiliser quelque chose comme Django-chronographe pour gérer la planification de la tâche plus facile

Si vous avez besoin d'aide pour comprendre comment écrire un script pour traiter le travail Voir l'article de James Bennett scripts de Django autonome pour obtenir de l'aide.

Si vous avez une charge de travail très élevée, ce qui signifie que vous aurez besoin de plus qu'un seul serveur pour traiter les travaux, vous souhaitez utiliser une vraie file d'attente de tâches de distribution. Il y a beaucoup de concurrence ici, donc je ne peux pas vraiment détailler toutes les options, mais un bon à utiliser avec pour Django Apps est céleri .


0 commentaires

1
votes

Avant de sélectionner une solution, vous devez déterminer comment le processus sera exécuté. C'est-à-dire le même processus pour chaque utilisateur, les données sont identiques et peuvent être programmées régulièrement? Ou chaque utilisateur demande-t-il quelque chose et les résultats sont-ils légèrement différents?

Par exemple, si les données seront identiques pour chaque utilisateur et peuvent être exécutées sur une planification, vous pouvez utiliser cron.

voir: http: // www. b-list.org/weblog/2007/sep/22/tandalone-django-scripts/ ou alors http://docs.djangoproject.com/fr/dev/howto / Commandes de gestion personnalisées /

Toutefois, si les demandes seront adhoc et que vous avez besoin de quelque chose d'évolutif pouvant gérer une charge élevée et est asynchrone: ce que vous recherchez réellement est un système de troisième message. Votre point de vue ajoutera une demande à la file d'attente qui sera ensuite agitée.

Il existe quelques options pour mettre en œuvre cela à Django: Le service de la file d'attente Django est purement django & python et simple, bien que la dernière commission était en avril et qu'il semble que le projet ait été abandonné. http://code.google.com/p/django-queue-service/ < / a>

La deuxième option si vous avez besoin de quelque chose de balance, est distribué et utilise des serveurs de trembles de messages open source: le céleri est ce dont vous avez besoin

http://ask.github.com/celery/introduction.html http://github.com/ask/celery/tree


2 commentaires

Oui, les résultats sont totalement différents par demande.


Demiurge, dans ce cas, vous devez examiner à quelle fréquence cette vue sera demandée. Si ce sera une amie, je suggère une solution de file d'attente. De cette façon, la vue peut être demandée, ajoutée à la file d'attente sans que l'utilisateur devait attendre qu'il soit terminé.