Je crée une application Django qui contient diverses computions longues avec des fichiers téléchargés. Je ne veux pas que l'utilisateur attendre que le fichier soit manipulé - je veux simplement afficher l'utilisateur une page de lecture de quelque chose comme «le fichier est en cours d'analyse».
Comment puis-je apporter une fonction asynchrone d'une vue ? p>
Quelque chose qui peut ressembler à ce que: p>
4 Réponses :
Sauf si vous n'avez plus besoin d'utiliser un processus distinct, ce qui semble être le gist des autres questions S.Lott indique en tant que duplication de la vôtre, le module code> filetage code> de la bibliothèque standard Python (documenté ici ) peut offrir la solution la plus simple. Assurez-vous simplement que gérer_file code> n'accède pas à aucun global qui pourrait être modifié, ni notamment modifier les globaux eux-mêmes; Idéalement, il devrait communiquer avec le reste de votre processus uniquement via Les instances ; etc, etc., toutes les recommandations habituelles sur le threading; -). P>
Merci pour votre réponse. Suis-je la compréhension correcte, que la principale application principale a quitté même si le fil avec une manipulation de fichier est toujours en marche ou non? Ou le fil sera également terminé? Si tel est le cas, c'est une sorte de ... inutile, car de nombreux serveurs SPOWNS gérer.PY PROCESSUMENT LE PROCESSAIRE EN COUVERTURE ET LES TUIREZ-LES s'il y a trop d'entre eux n'étant pas occupé. Je suis vraiment vraiment à la recherche d'ajouter quelque chose comme OS.System ('Python Handine_File.py Path / to / File') ...
Je suis juste compris que ce sera toujours un sous-processus ... devinez, j'ai juste besoin d'utiliser des subprocessages.Popen
Si vous avez besoin d'une sous-processus, vous avez besoin d'un sous-processus et que S.Lott était juste (devinez qu'il y a une raison pour laquelle le gars a presque deux fois mon représentant ;-). Mais, pour l'exhaustivité: un processus python se termine "naturellement" lorsque le dernier fil de non-démon se termine, non auparavant; Donc, les threads dont les travaux sont importants à résilier doivent être non-démon (par défaut) ou explicitement .join'd par le fil principal à la fin du processus, tandis que «Threads de travailleur», les tâches de fond devraient être des démonstres (et non .join ' d à ;-) iff ils peuvent être résiliés sans danger.
Hmmm, essayé ou sous-processus, mais il est toujours synchrone, l'utilisateur doit attendre que la page se charge.
Plutôt que d'essayer de gérer cela via des sous-processus ou des threads, je vous recommande de le séparer complètement. Il y a deux approches: le premier consiste à définir un drapeau dans une table de base de données quelque part, et avoir un travail cron fonctionnant régulièrement qui vérifie le drapeau et effectue l'opération requise. P>
La deuxième option consiste à utiliser une file d'attente de message. Votre processus de téléchargement de fichier envoie un message sur la file d'attente et un auditeur distinct reçoit le message et fait ce qui est nécessaire. J'ai utilisé Rabbitmq pour ce genre de chose, mais d'autres sont disponibles. P>
De toute façon, votre utilisateur n'a pas à attendre le processus de finition et vous n'avez pas à vous soucier de la gestion des sous-processus. P>
Oh, comment je n'ai-je pas pensé à ça! Merci, c'est vraiment un bon point. J'ai presque oublié de cron du tout. Merci, cela devrait résoudre le problème soigneusement :)
Le problème est résolu via cron (et un script Shedle Shedule Python sur la machine de débogage, qui agit comme un simple cron :))
BTW, si quelqu'un lit la situation actuellement, je conseille d'essayer le céleri.
J'ai essayé de faire de même et j'ai échoué après une tentative multiple en raison de la nature de Django et d'autres appels asynchrones. P>
La solution que j'ai mises en place, ce qui pourrait être un peu sur le dessus, c'est d'avoir un autre serveur asynchrone dans les files d'attente de traitement des antécédents de la requête Web et de lancer un JavaScript déchiqueté qui vous permet d'analyser directement à partir du navigateur d'une asynchrone. manière (c.-à-d.: Ajax). P>
Tout est fabriqué transparent pour l'utilisateur final via le réglage mod_proxy. P>
Merci pour l'idée, mais je suppose que je dois juste utiliser cron pour lancer une commande manag.py qui analysent tous les fichiers en file d'attente toutes les deux minutes, car le projet n'est pas si énorme et public d'exécuter un deuxième serveur :)
Le threading va casser RunServer si je ne me trompe pas. J'ai eu de la chance avec la multiropess dans les manutentionnaires de demande avec mod_wsgi et runserver. Peut-être que quelqu'un peut m'éclairer pourquoi c'est mauvais: http://docs.python.org/library/multiproCessing.html p> Nouveau en 2.6 P> P>
Je pense que parce que vous devez avoir un p.join () quelque part pour rejoindre les processus séparés :)
Duplicaté: Stackoverflow.com/Questtions/546017/... , Stackoverflow.com/questions/1081340/...
Encore plus similaire: Stackoverflow.com/Questtions/1239035/...