java - 将 ForkJoinPool 与 AsyncHttpClient 一起使用 - 这有意义吗?

标签 java multithreading asynchronous asynchttpclient forkjoinpool

我的问题与this question about ForkJoinPool and IO-oriented operations有些相关,但它稍微更笼统一些(我链接的问题没有得到明确的答案)。简而言之 - 如果我想并行发送许多 HTTP 请求,并且已经使用异步 HTTP 客户端(例如 AsyncHttpClient ),那么是否有必要使用 ForkJoinPool 并行提交请求?

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

我还读过this question关于如何在 Java 中并行发送 HTTP 请求,所有答案都提到使用 ExecutorService 或 AsyncHttpClient,但没有答案提到两者。

最佳答案

它们是正交的概念,因此您不会在相同的答案中看到它们被提及。

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

ForkJoinPool 致力于通过拥有许多线程来最大化 CPU 使用率(公共(public)池默认具有 CPU 核心 - 1,您创建的线程可以有更多/更少)并通过工作窃取使线程不会空闲,这对于小型递归任务来说是最有效的。

该链接讨论了工作窃取对于非递归任务有效。 “异步”这个词让您感到困惑,但它只是指您提交到池的常规任务,并且它异步完成。

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

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

关于java - 将 ForkJoinPool 与 AsyncHttpClient 一起使用 - 这有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60887950/

相关文章:

java - 在 Android 设备上将视频转换为音频 (Java)

java - 在Java中,不使用静态或类变量的方法需要同步吗?

c++ - 异步 lib​​pcap : losing packets?

Java:将 TRUE/FALSE 的所有可能组合添加到列表中

java xml上传问题!

c# - 如何从 Windows 服务运行 exe 并在 exe 进程退出时停止服务?

android - 线程中的值未更新

c# - 是否有用于将控件绑定(bind)到异步数据的明确定义的模式?

java - 从 Service 异步方法返回值到 Activity

java - ZeroDateTimeBehavior=convertToNull 在使用 hibernate 的 jdbc url 中不起作用