如何在CherryPy中执行异步后处理?

时间:2009-08-21 09:33:12

标签: python asynchronous cherrypy

上下文 想象一下,你有一个标准的CherryPy hello word app:

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

并且您希望进行一些后处理,即记录请求处理,或者只记录我们从特定IP调用的事实。你会做的可能是:

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

但是,这会增加您的请求处理时间。 (顺便说一下。如果你想在每个函数上调用它,你可能会使用装饰器,甚至是一些更复杂的方法)。

问题: 有没有办法创建一个全局线程感知队列(缓冲区),每个请求可以写入需要记录的消息(事件),而一些魔术函数将抓住它并进行后处理?你知道这种事情的模式吗?

我敢打赌CherryPy支持这样的事情: - )

提前谢谢你......

3 个答案:

答案 0 :(得分:7)

“全局线程感知队列”称为Queue.Queue。我刚刚在http://tools.cherrypy.org/wiki/BackgroundTaskQueue

添加了一个食谱

答案 1 :(得分:2)

on_end_request custom tool可能就是您想要的。

答案 2 :(得分:2)

由于我正在寻找这个并且现在已经过时了,我发现提供正确的(2012年)答案很有用。只需在处理您的网址的函数的开头添加:

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

文档中有更多关于钩子的信息,但对我来说并不是很清楚。