[英]Load balancing for thread pool in java
免责声明:这与此不一样。
有些任务会同时消耗网络和 CPU。 有时性能会影响网络,有时会影响 CPU。 因此,取决于我需要在程序运行之前无法精确设置的不同线程数。 理想情况下,每个任务都应该记录它的时间(和一些其他参数),如果时间增加 -> 线程池减少线程,否则当任务更快完成时 -> 线程数应该增加。
当然,应该有防止持续负载平衡的保护:例如,当系统添加 1 个线程并删除它时,由于任务时间发生变化,因此一次又一次地重复此操作。
java是否提供类似的东西?
目前在 Java 中,线程非常昂贵,直接一对一映射到宿主 OS 线程。 它们会影响内存使用和 CPU 使用。 所以我们通常将线程数限制在几个,通常大致是内核数左右。 所以现在增加/减少线程池的大小不太可能有意义。
听起来您的场景非常适合来自Project Loom项目的虚拟线程(纤维)。 许多虚拟线程映射到单个主机操作系统线程。
在今天的 Java 线程中,如果 Java 代码阻塞,主机操作系统线程就会阻塞。 不会对该线程执行进一步的工作。 对于虚拟线程,当 Java 代码阻塞时,虚拟线程会从其分配的主机操作系统线程中卸载,并“停放”。 当该代码最终返回并因此需要进一步执行时,它会被挂载到另一个主机操作系统线程上。 这种虚拟线程的停放和挂载比主机操作系统线程的阻塞/解除阻塞要快得多。 虚拟线程对内存和 CPU 的影响要小得多。 因此,我们可以在传统硬件上同时运行数千甚至数百万个线程。
在您的工作负载可能上升或下降的场景中,Project Loom 中的虚拟线程设施将自动管理线程池和调度。 您应该毫不费力地看到吞吐量大大提高。
一些警告:
虚拟线程和其他 Project Loom 功能在 Java 19 中作为预览功能提供,现在提供实验性构建。
有关更多信息,请参阅 Project Loom 团队成员(例如 Ron Pressler 和 Alan Bateman)的文章、演示文稿和采访。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.