Adr*_*ian 0 java spring graphql
我真正想弄清楚的是如何思考这个问题,或者从在这个领域有更多经验的人那里得到一些见解。
假设这是一个 Web 服务中的单例类,就像一个 graphql 数据获取器。哪个在规模上更高效:第一个还是第二个?或者会有什么性能差异?
public class FooBarClass {
public List<Bar> getSomeStuff() {
List<Bar> bar = new ArrayList<Bar>;
final ExecutorService threadpool = Executors.newFixedThreadPool(10);
//Get the stuff in multithreaded way.
threadpool.shutdown();
return bar;
};
}
}
Run Code Online (Sandbox Code Playgroud)
或者
public class FooBarClass {
final ExecutorService threadpool = Executors.newFixedThreadPool(10);
public List<Bar> getSomeStuff() {
//...
//Get the stuff using the executor service.
return bar;
};
}
}
Run Code Online (Sandbox Code Playgroud)
我发现使用 executor 服务肯定会加速代码。我们正在执行类似批处理的提取,但由于某些原因我们需要进行单次提取,因此所有提取都是异步的。
这真的取决于。
假设每个服务都有自己的 10 个线程池,假设有 50 个服务,总共有 500 个线程。
当您有大量线程时(不是 500 就一定很大),很可能它们中的大多数在大部分时间都处于空闲状态,这是相当浪费的。线程有开销,它们之间的上下文切换相对较慢。
如果每个服务都有自己的池,那么可能会出现一个服务的池完全耗尽,任务队列巨大,而其他执行器完全空闲的情况。在这些情况下,池可以合作并共享资源会更好。这是共享公共池的服务的情况。
不过,与其他服务的隔离有时是好的。任务具有不同的优先级,您不希望琐碎的低优先级作业消耗所有线程,而让高优先级作业在队列中等待。这是每个服务都有自己的池的情况。
在实践中,我发现最好的方法是在中间的某个地方。有些服务是高优先级的,我不希望它们受到应用程序其他地方发生的事情的影响。我为这些类型的服务提供了一个专用的线程池。其他服务优先级不高,我不在乎任务提交和执行之间是否有小延迟。对于那些,我让它们共享一个公共线程池。
| 归档时间: |
|
| 查看次数: |
35 次 |
| 最近记录: |