考虑一个可以分解成数百个小的,可独立运行的任务的大任务。更具体地说,每个小任务是发送轻型网络请求并决定从服务器接收的答案。这些小任务预计不会花费超过一秒的时间,并且总共需要几台服务器。
我想到了使用Executor框架实现这一点的两种方法,我想知道哪一个更好,为什么。
我很抱歉,如果我的问题表明我懒得测试这些,并亲眼看看哪些更好(至少在性能方面)。在回答这个具体案例时,我的问题有一个更为笼统的方面。在这种情况下,当你想使用执行程序来完成所有的调度和其他工作时,创建大量小任务或将它们分组到更少数量的更大任务中会更好吗?
答案 0 :(得分:3)
创建大量小任务或将这些小任务分组到更少的更大任务中会更好吗?
很难用这样的问题来概括,但在你的情况下,我认为创建一些每个做5到10个事情然后将它提交给执行者服务的任务是没有意义的。
我会将所有工作作为一堆单独的小任务提交给ExecutorService
。我认为从对象/代码的角度来看,这将使任务变得更加清晰。他们不必拥有一系列请求/响应,并且可以专注于发出一个请求并处理一个响应。
如果您不想将并发请求发送到特定服务器,则会出现一个例外。然后让任务执行特定服务器的所有请求/响应并为每个服务器提交任务是有意义的。
答案 1 :(得分:2)
总的来说,我会说较小的任务更好,因为它们就像模块一样,并且可以以所需的方式组合,即使需求发生变化。
但是,如果它们只能作为一个块执行,那么您可以通过一项重大任务获得更好的概述。
性能当然也是一个问题。但这在很大程度上取决于服务器/机器的CPU数量和整个系统的负载。即使我们知道你究竟在做什么,你也需要进行测试以确定哪些更有效率。但请记住,任务的初始化和管理也需要一些时间,如果您的操作非常小,您可能会在任务管理上投入比在实际执行中更多的时间。
并行运行所有(小)任务对于需要处理请求的应答服务器来说也可能是困难的。请记住,Web服务通常也会对可以提供的并行请求数量进行限制。