我有一个 Web 应用程序请求运行超过 10 分钟的报告。除了提高性能之外,我现在更喜欢设置一个线程来运行报告并将其邮寄给用户,立即将该决策消息返回给用户。
我一直在看cherrypy.process.plugins.Monitor,但我不清楚它是否是正确的选择(如何处理频率参数?)
我有一个 Web 应用程序请求运行超过 10 分钟的报告。除了提高性能之外,我现在更喜欢设置一个线程来运行报告并将其邮寄给用户,立即将该决策消息返回给用户。
我一直在看cherrypy.process.plugins.Monitor,但我不清楚它是否是正确的选择(如何处理频率参数?)
监视器不是正确的选择;它用于按计划重复运行相同的任务。打电话给你可能会更好threading.Thread(target=run_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
事务的计算时间。你不想在这个 perioic 例程上增加工作量computations
列表;check
你的程序中访问它(甚至是间接的),就会陷入死锁。如果您想从computations
列表中取消订阅某些内容,可能就是这种情况。