我有一个Web应用程序,它请求运行时间超过10分钟的报告。除了提高性能之外,我现在更愿意设置一个线程来运行报告并将其邮寄给用户,并立即将该决策消息返回给用户。
我一直在关注cherrypy.process.plugins.Monitor,但我不清楚它是否是正确的选择(如何处理频率参数?)
答案 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
列表; check
从computations
访问它(甚至间接),您的程序就会陷入僵局。如果您想取消订阅{{1}}列表中的内容,可能就是这种情况。