0

在我们的 Web 应用程序中,对于每个 http 请求,后端都会发生大量计算。输出可以从 10 秒到 1 小时不等。在计算的同时,网站上会为相应用户显示“Waiting..”。

但是碰巧的是,用户可能会在两者之间减少服务。那么后端可以做些什么,以便在两者之间停止计算以节省资源呢?这里可以应用哪些不同的策略?

如果更好(而不是直接杀死线程),那么优雅的终止策略应该会产生奇迹。

4

1 回答 1

1

我不确定这是否适合您的情况,但这是我过去解决此问题的方式。我们正在为一个网络应用程序生成 pdf 报告。大多数报告可以在 5 秒内生成,但有些可能需要一个小时。

当用户单击生成按钮时,我们将它们重定向到“正在生成...”对话框屏幕,该屏幕具有一种进度条和一个取消按钮。这也会在单独的线程中启动服务器上的生成过程(我们有一个工作池)。然后浏览器通过 ajax 定期轮询服务器以检查进度(更新进度条或完成后重定向到显示页面)。

生成进程和 ajax 进程之间的服务器同步是通过进程同步对象完成的。sync-obj 是一个非常简单的类实例,可以通过一些唯一的字符串随时从任何线程中快速检索。

两个进程都可以更新这个共享的同步对象。当报告生成时,repgen 线程将更新 ajax 线程将通知浏览器的 sync-obj。如果用户单击了取消按钮,那么 ajax 线程将在 sync-ob 中设置“取消”标志,并且 repgen 线程将拾取该标志并跳出生成循环。

显然,整个过程的响应能力很大程度上取决于 repgen 线程检查同步 obj 的频率,而这通常归结为单个报告的编码方式。

最后,为了回答您的问题,如果用户感到无聊并“返回”并再次单击生成按钮,我们不会取消第一个报告并开始第二个报告,而是意识到它是相同的报告(以及相同的同步对象id) 所以让报告继续。但是,如果这不适合您的场景,那么启动生成过程可以取消第一个过程,就像用户可以通过“取消”按钮一样。

于 2012-09-13T06:38:09.053 回答