有没有办法使用cherrypy的Monitor执行单个任务然后停止?

时间:2012-04-22 06:54:40

标签: multithreading monitor cherrypy

我有一个Web应用程序,它请求运行时间超过10分钟的报告。除了提高性能之外,我现在更愿意设置一个线程来运行报告并将其邮寄给用户,并立即将该决策消息返回给用户。

我一直在关注cherrypy.process.plugins.Monitor,但我不清楚它是否是正确的选择(如何处理频率参数?)

2 个答案:

答案 0 :(得分:3)

监控不是正确的选择;它是按计划重复运行相同任务的。你可能最好只打电话给threading.Thread(target=run_report).start()。然后,您可以向用户返回202 Accepted,以及客户端的URL以查看状态和/或在准备好时检索新创建的报告资源。

有一点需要注意的是,当cherrypy.engine停止时,您可能希望新线程正常关闭。看看各种插件,了解如何连接到“停止”的示例。公交车上的通道。另一个选择是让你的线程守护,如果你不关心它是否异常终止。

答案 1 :(得分:0)

除了同意fumanchu的回答之外,我想补充一点,频率参数实际上是以秒为单位表示的期间cherrypy.process.plugins.Monitor(这个名字具有误导性。)

另一种可能的解决方案可能是定期执行监视器,以及可以定期检查完成的一组工作计算。代码类似于

class Scheduler:

    def __init__ (self):
        self.lock = threading.Lock()
        self.mon = Monitor(cherrypy.engine, check_computations, frequency=whatever)
        self.mon.start()
        self.computations = list() # on which we append stuff

    def check_computations (self):
        with self.lock:
            for i in self.computations:
                check(i) # Single check function

注意事项:

  • check的计算时间很重要。您不希望在此常规程序上有工作量
  • 注意你如何使用锁:
    • 正在保护computations列表;
    • 如果您使用checkcomputations访问它(甚至间接),您的程序就会陷入僵局。如果您想取消订阅{{1}}列表中的内容,可能就是这种情况。