0

我正在做一个 Web 应用程序,它以 Java 作为前端,以 shell 脚本作为后端。这个概念是我需要在后端处理多个文件。我将从用户那里获取日期范围(例如从 7 月 1 日至 8 日),并且每天处理大约 100 个文件。所以我总共有 800 个文件要处理。

我将从 JSP 获取这些详细信息,并将后台调用委托给 shell 脚本,然后取回结果并将其显示给用户。

现在我以顺序方法完成所有这些 - 我的意思是没有线程。所以只有一个主线程在执行,用户必须等到 800 个文件被顺序处理。然而,这真的很慢。正因为如此,我正在考虑寻找线程。由于我是线程的初学者,因此我阅读了一些有关此的内容,并提出了以下想法:

当我阅读线程工作必须拆分时.. 我想将 8 天的工作拆分为 4 个线程,每个线程将执行 2 天的工作


我想知道我是否遵循正确的方法,我主要担心的是:

  1. 是否建议从 Web 应用程序生成多个线程
  2. 这是否是一个好方法

有关如何进行此操作的一些指导。一个例子会很棒。谢谢你。

4

4 回答 4

0

是的,您可以在多线程或任何高性能环境中运行长处理作业。您还应该使用 Servlet 3.0 异步请求处理来暂停请求线程并等待 Long 处理任务完成。

于 2012-07-10T06:55:07.093 回答
0

在 Web 应用程序中创建线程不是一个好的解决方案。这是一个糟糕的设计,因为通常它是负责该活动的容器(Web 服务器)。所以我认为你必须找到另一个解决方案。

我建议您将 shell 脚本放在 cron 中,安排为每分钟运行一次,并“激活”它们,您可以触摸充当信号量的文件。在每次运行时,脚本都会验证 Web 应用程序是否接触了信号量文件,如果是,它们会从这些文件中读取日期间隔,然后开始处理。

于 2012-07-10T07:26:43.653 回答
0

改善用户体验的方法不是在 Servlet 级别上并行化 100000 个线程,而是提供视图的增量渲染。首先,例如根据 MVC 模式,将应用程序分成多个层会很有用。

这么说,你将不得不看看如何

  • 创建一个能够返回部分答案和最后一个答案的服务,这意味着所有可用数据都已返回。每个答案都可以并行计算以提高性能。

  • 以增量方式填充网页,通常通过回调此服务来返回您用来向 DOM 添加数据的 JSON 字符串。每次获得答案时,如果这是部分答案,则再次调用提供先前序列号的服务。

如果您向 Liligo 了解,您将了解这是如何工作的。我描述的技术称为轮询,但还有其他技术可以在 UI 级别获得类似的异步结果。通常,您不想直接使用 Servlet API,这是一个非常低级的 API,而是为此使用合理的框架或抽象。

如果你想要一个温暖的建议,你应该看看 Play!框架http://www.playframework.org/documentation/2.0.2/JavaStream HTTP 流。

于 2012-07-10T08:44:40.000 回答
0
  1. 是的,从 Web 应用程序生成多个线程并没有错。事实上,如果您正在运行一个 Servlet 容器(很可能是因为您使用的是 Java),那么它已经为您生成了多个线程。一般来说,Servlet 容器会自动生成一个新线程(或从池中重用一个)来处理它接收到的每个请求。

  2. 您的方法很好,认为您需要根据系统的硬件配置和 Web 服务上的并发负载量将线程数微调为合适的值。另请注意,虽然启动一堆线程会减少处理所有数据所需的总时间,但在任何数据准备好返回给用户之前,它仍然会留下潜在的大量时间。因此,您可以通过按顺序执行较小的工作单元并在每批结果准备好后立即将其发布到用户界面来获得更好的结果。然后,用户仍然需要很长时间才能获得所有数据,但几乎可以立即开始查看其中的至少一部分。

于 2012-07-10T07:23:17.693 回答