4

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

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

4

2 回答 2

3

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

需要注意的是,当cherrypy.engine 停止时,您可能希望新线程正常关闭。查看各种插件,了解如何连接到总线上的“停止”通道的示例。如果您不在乎它是否异常终止,另一种选择是使您的线程成为守护进程。

于 2012-04-23T17:09:22.973 回答
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事务的计算时间。你不想在这个 perioic 例程上增加工作量
  • 请注意如何使用锁:
    • 它正在保护computations列表;
    • 如果你从check你的程序中访问它(甚至是间接的),就会陷入死锁。如果您想从computations列表中取消订阅某些内容,可能就是这种情况。
于 2014-03-17T10:50:40.610 回答