将ForkJoinPool与AsyncHttpClient一起使用-是否有意义?

时间:2020-03-27 14:24:05

标签: java multithreading asynchronous asynchttpclient forkjoinpool

我的问题在某种程度上与this question about ForkJoinPool and IO-oriented operations有关,但它的含义较为笼统(我链接到的问题没有得到明确的答案)。简而言之-如果我想并行发送许多HTTP请求,并且已经在使用异步HTTP客户端(例如AsyncHttpClient),那么也可以使用ForkJoinPool并行提交请求吗?

最初,我认为这样做违反了使用异步HTTP客户端的目的,该客户端已经可以并行发送请求。但是,读this related question about ForkJoinPool时提到,即使“当所有任务都异步并提交到池而不是分叉时,ForkJoinPool仍可能提高性能”,这使我怀疑我对Java中异步操作的工作方式以及应该如何理解的了解。被执行。在我的情况下,使用ForkJoinPool仍然有优势,如果可以,为什么呢?

我还读过this question,了解如何在Java中以并行方式发送HTTP请求,所有答案都提到使用ExecutorService或AsyncHttpClient,但是没有答案都提到。

1 个答案:

答案 0 :(得分:1)

它们是正交的概念,所以这就是为什么您没有在相同的答案中看到它们的原因。

AsyncHttpClient的目标(除其他事项外)是对所有网络通信使用单线程(由Netty通过Java的NIO在内部以非阻塞异步方式执行),而不是传统的“每请求线程数”模型。在网络层的单线程之上,该库具有工作线程,这些工作线程执行AsyncHttpClient用户可见的应用程序级别异步处理,这意味着它已经具有一个(较小的)内部池。线程。

ForkJoinPool努力通过拥有许多线程(默认情况下,公共池具有CPU cores - 1,您创建的线程可以拥有更多/更少线程)并通过窃取工作来最大化CPU使用率因此线程不会处于空闲状态,这对于小型的递归任务是最有效的。

该链接讨论了非递归任务窃取工作还很有效。 “异步”一词将您甩到了那里,但这只是指您提交到池中的常规任务,并且异步完成。

因此您可以 用一个线程池执行每个请求的线程(即基本I / O或“旧I / O”),可以使用没有线程池的单线程非阻塞NIO(即New I / O)。

将它们组合起来没有任何意义。您将从每请求线程模型迁移到非阻塞模型以提高性能。