J'ai besoin de gérer un processus important (temps et de consommation de mémoire) de manière asynchrone dans une application Web2PY appelée à l'intérieur d'une méthode du contrôleur. P>
Mon étui d'utilisation spécifique consiste à appeler un processus via stdlib.subrocess code> et attendez qu'il quitte sans bloquer le serveur Web, mais je suis ouvert à des méthodes alternatives. P>
3 Réponses :
Ceci est plus difficile que possible. Notez les avertissements de l'impasse dans le documentation STDLIB.SUBPROCESS . C'est facile si cela ne vous dérange pas de blocage --- Utilisez popen.commiquez. Pour contourner le blocage, vous pouvez gérer le processus à l'aide de STDLIB.SUBPROCESS à partir d'un fil. P>
Mon moyen préféré de faire face aux sous-processus est d'utiliser Processé de sonnelle torsadée . Mais il n'est pas facile de se rendre tordu pour jouer bien avec d'autres cadres. P>
En supposant que vous devez démarrer plusieurs, éventuellement simultanément, des instances de la tâche d'arrière-plan, la solution est une file d'attente de tâches. J'ai entendu de bonnes choses sur le céleri et la rabbitmq, si vous recherchez des options de 3ème partie, et web2py inclut C'est sa propre file d'attente de tâches qui pourrait être suffisante pour vos besoins. p>
Avec l'un des outils, vous définissez une fonction qui encapsule l'opération que vous souhaitez effectuer le processus d'arrière-plan. Apportez ensuite les travailleurs de la file d'attente de tâches en ligne. Le manuel Web2py et les forums indiquent que cela peut être effectué avec une instruction @reBoot dans le système Web2PY CRON, qui est déclenchée chaque fois que le serveur Web commence. Il existe probablement d'autres moyens de démarrer les travailleurs si cela n'est pas satisfaisant. P>
Dans votre contrôleur, vous insérerez une tâche dans la file d'attente de la tâche, en transmettant les paramètres nécessaires en tant qu'entrants de la fonction (la fonction d'arrière-plan ne s'exécutera pas dans le même environnement que le contrôleur, de sorte qu'il n'aura pas accès au Session, DB, etc. Sauf si vous ne transmettez pas explicitement les valeurs appropriées dans la fonction de tâche). P>
Maintenant, pour obtenir la sortie de l'opération d'arrière-plan à l'utilisateur. Lorsque vous insérez une tâche dans la file d'attente de la tâche, vous devez récupérer un identifiant unique pour la tâche. Vous impliqueriez ensuite la logique du contrôleur (soit quelque chose qui attend un appel AJAX, ou une page qui continue à rafraîchir jusqu'à ce que la tâche achève) qui appelle l'API de la file d'attente pour vérifier l'état de la tâche spécifiée. Si l'état de la tâche est «terminé», renvoyez les données à l'utilisateur. Sinon, continuez à attendre. P>
Je pense que le planificateur de tâches intégré était juste que je cherchais.
Peut-être examiner la section du livre sur Tâches en cours en arrière-plan . Vous pouvez utiliser le nouveau planificateur ou créer une maison File d'attente ( exemple de messagerie ) . Il y a aussi un plug-in web2py-célery , bien que je ne suis pas sûr de l'état qui est dans. p>