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

5 投票
2 回答
3467 浏览
提问于 2025-04-15 13:46

背景:想象一下,你有一个标准的 CherryPy “你好,世界” 应用:

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

现在你想做一些后续处理,比如记录请求的处理过程,或者仅仅是记录一下我们是从哪个特定的 IP 被调用的。你可能会这样做:

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

不过,这样做会增加你的请求处理时间。(顺便说一下,如果你想在每个函数上都调用它,可能还会用到装饰器,或者一些更复杂的方法)。

问题:有没有办法创建一个全局的、支持多线程的队列(缓冲区),让每个请求都能写入需要记录的消息(事件),然后有一个神奇的函数去抓取这些消息并进行后续处理?你知道这样的模式吗?

我敢打赌 CherryPy 支持这样的功能 :-)

提前谢谢你...

2 个回答

2

我在寻找这个问题的答案时发现它已经过时了,所以我觉得有必要提供一个正确的答案(大约是2012年的)。只需在处理你网址的函数开头加上这一行:

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

文档中有关于钩子的更多信息,但我觉得不是很清楚。

7

“全局线程感知队列”叫做 Queue.Queue。

撰写回答