Multithreading 有没有办法使用cherrypy';让监视器执行单个任务,然后停止?

Multithreading 有没有办法使用cherrypy';让监视器执行单个任务,然后停止?,multithreading,monitor,cherrypy,Multithreading,Monitor,Cherrypy,我有一个web应用程序,它请求一个运行时间超过10分钟的报告。除了提高性能之外,我现在更愿意设置一个线程来运行报告并将其发送给用户,并立即将决策消息返回给用户 我一直在看cherrypy.process.plugins.Monitor,但我不清楚它是否是正确的选择(如何处理频率参数?Monitor不是正确的选择;它用于按计划重复运行同一任务。您最好只调用threading.Thread(target=run\u report.start())。然后,您可以向用户返回202 Accepted,以及

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


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

Monitor不是正确的选择;它用于按计划重复运行同一任务。您最好只调用
threading.Thread(target=run\u report.start()
)。然后,您可以向用户返回
202 Accepted
,以及一个URL,供客户端在准备就绪时查看状态和/或检索新创建的报表资源


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

除了同意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
    的计算时间很重要。你不想在这周的例行工作中有工作量
  • 注意如何使用锁:
    • 它正在保护
      计算
      列表
    • 如果您使用
      检查
      访问它(甚至是间接地),您的程序将陷入死锁。如果您想从
      计算
      列表中取消订阅某些内容,则可能会出现这种情况

非常感谢,fumanchu。也许我可以更好地使用监视器来监视打印作业(通过检查在打印作业运行时定期更新的DB条目的值),然后关闭打印作业线程。感谢Dacav给出的深思熟虑的答案。在追求web2py和flask的过程中,我已经搁置了我的cherrypy调查。然而,你提出的机制很有趣。。。