Multithreading 有没有办法使用cherrypy';让监视器执行单个任务,然后停止?
我有一个web应用程序,它请求一个运行时间超过10分钟的报告。除了提高性能之外,我现在更愿意设置一个线程来运行报告并将其发送给用户,并立即将决策消息返回给用户Multithreading 有没有办法使用cherrypy';让监视器执行单个任务,然后停止?,multithreading,monitor,cherrypy,Multithreading,Monitor,Cherrypy,我有一个web应用程序,它请求一个运行时间超过10分钟的报告。除了提高性能之外,我现在更愿意设置一个线程来运行报告并将其发送给用户,并立即将决策消息返回给用户 我一直在看cherrypy.process.plugins.Monitor,但我不清楚它是否是正确的选择(如何处理频率参数?Monitor不是正确的选择;它用于按计划重复运行同一任务。您最好只调用threading.Thread(target=run\u report.start())。然后,您可以向用户返回202 Accepted,以及
我一直在看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
- 注意如何使用锁:
- 它正在保护
列表李>计算
- 如果您使用
检查
访问它(甚至是间接地),您的程序将陷入死锁。如果您想从
列表中取消订阅某些内容,则可能会出现这种情况计算
- 它正在保护