gpt4 book ai didi

java - 如何在 Java 中执行非阻塞 HTTP 调用?

转载 作者:行者123 更新时间:2023-12-03 23:08:21 26 4
gpt4 key购买 nike

我有一个第三方 API,我使用 HTTP GET 请求调用它。每个请求需要几秒钟才能获得响应。

目前我正在使用一个 CompletableFuture,我正在一个大小为 64 的 FixedThreadPool 上执行。这导致线程被阻塞,直到它收到对 GET 请求的响应,即线程在发送 GET 响应后处于空闲状态,直到它们收到响应.因此,我可以发出的最大并发请求数受到线程大小的限制,即此处为 64。

我可以使用什么来代替 CompletableFuture,以便我的线程不会闲置等待响应?

最佳答案

正如@user207421 所说:

  • 真正异步(即事件驱动)的 HTTP 客户端应用程序很复杂。
  • 多线程(但基本上是同步的)HTTP 客户端应用程序更简单,并且可以扩展到与内存相同的线程数。
  • 假设您有 64 个工作线程处理请求,实际瓶颈可能是您的物理网络带宽或可用的客户端 CPU。如果您已达到这些限制,则:
  • 增加工作线程的数量无济于事,
  • 切换到异步(事件驱动)模型无济于事。
  • 第三种可能性是瓶颈是服务器端资源限制或速率限制。在这种情况下,增加客户端线程数可能会有所帮助,也可能没有效果,或者会使问题变得更糟。这将取决于服务器的实现方式、请求的性质等。

  • 如果您的瓶颈确实是线程数,那么一个简单的尝试就是减少工作线程堆栈大小,以便您可以运行更多的线程。默认堆栈大小通常为 1MB,这很可能比实际需要的大得多。 (这也将减少...... erm ... 空闲线程的内存开销,如果这是一个真正的问题。)

    有一些 Java 异步 HTTP 客户端库。但我从来没有用过一个,也不能推荐一个。和@user207421 一样,我不相信改变的努力会真正得到返回。

    What can I [do] so that my threads don't sit idle waiting for the response?



    空闲线程实际上不是问题。空闲线程仅使用内存(以及一些可能在这里无关紧要的可能的次要影响)。除非你内存不足,否则不会有什么区别。

    注意:如果在线程等待服务器响应时客户端还有其他事情要做,操作系统线程调度程序将切换到不同的线程。

    So my maximum number of simultaneous requests I can send out is limited by my thread [pool] size i.e. 64 here.



    那是真实的。但是,同时发送更多请求可能无济于事。如果客户端线程处于空闲状态,则可能意味着瓶颈在于网络或服务器端的某些内容。如果是这种情况,添加更多线程不会增加吞吐量。相反,单个请求将花费(平均)更长的时间,并且吞吐量将保持不变……或者如果服务器开始从其请求队列中删除请求,则可能会下降。

    最后,如果您担心大量闲置的工作线程池(等待下一个任务执行)的开销,请使用可以收缩和增长其线程池以满足不断变化的工作负载的执行服务或连接池。

    关于java - 如何在 Java 中执行非阻塞 HTTP 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60796488/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com