2009-08-21 7 views
4

Contexte: Imaginez que vous avez une norme CherryPy bonjour mot app:Comment exécuter un post-traitement asynchrone dans CherryPy?

def index(self): 
     return "Hello world!" 
    index.exposed = True 

et que vous voulez faire un peu de post-traitement, à savoir le traitement des demandes d'enregistrement ou connectez-vous le fait que nous avons été appelés à partir IP spécifique. Ce que vous feriez serait probablement:

def index(self): 
    self.RunMyPostProcessing() 
    return "Hello world!" 
index.exposed = True 

Cependant, cela va ajouter à votre temps de traitement des demandes. (Et probablement vous utiliserez des décorateurs, ou même une méthode plus sophistiquée si vous souhaitez l'appeler sur chaque fonction).

Question: est-il un moyen de créer une file d'attente au courant de filetage global (tampon) auquel chaque demande peut écrire des messages (événements) qui doit être connecté, alors une fonction magique saisira et post-traitement? Connaissez-vous un modèle pour une telle chose?

Je parie que CherryPy soutient quelque chose comme ça :-)

Merci à l'avance ...

Répondre

7

La "file d'attente de threading globale" s'appelle Queue.Queue. Je viens d'ajouter une recette pour cela à http://tools.cherrypy.org/wiki/BackgroundTaskQueue

+0

Est-ce que vous lisez dans mon esprit (mon code) ou quoi? ;-)) Merci beaucoup, c'était exactement le genre de solution que je recherchais. – stic

+0

Merci de m'avoir sauvé deux jours de travail! – xApple

2

Comme je cherchais cela et il est maintenant obsolète, j'ai trouvé utile de fournir la bonne réponse (2012). Il suffit d'ajouter ceci au début de la fonction qui gère votre URL:

cherrypy.request.hooks.attach('on_end_request', mycallbackfunction) 

Il y a plus d'infos sur les crochets dans la documentation, mais il est pas très clair pour moi.