有没有一种方法可以确定理想的线程数? [重复]

问题描述

|                                                                                                                   这个问题已经在这里有了答案:                                                      

解决方法

我们已经开发了多线程并行Web搜寻器。基准测试吞吐量是了解野兽如何处理其工作的最佳方法。对于专用的Java服务器,每个内核一个线程是启动的基础,然后I / O开始发挥作用并进行更改。 在一定数量的线程之后,性能确实会下降。但这也取决于您抓取的网站,所使用的操作系统等。尝试找到一个响应时间恒定的网站来做您的第一个基准测试(例如Google,但采用其他服务) 对于慢速的网站,更多的线程倾向于补偿I / O阻塞     ,看看我在这个线程中的答案 如何找出最佳线程数量? 您的示例可能是受CPU限制的,因此您需要一种解决争用的方法,以便能够计算出要使用的正确线程数,并使所有线程都处于忙碌状态。进行性能分析很有帮助,但请记住,它取决于内核数(以及已经提到的网络延迟等),因此在连接线程池大小时,可以使用运行时获取内核数。 恐怕没有快速答案,恐怕会有测试,测量,调整,重复的内容!     ,理想的线程数应接近硬件提供的核心(虚拟核心)数量。这是为了避免线程上下文切换和线程调度。如果您要执行大量的IO操作,并且执行许多阻塞读取(套接字读取中的线程块),则建议您重新设计代码以使用非阻塞IO API。通常,这将涉及一个“选择器”线程,该线程将监视成千上万个套接字的活动,而少量的工作线程将进行处理。如果您使用Java编写代码,则API为NIO。唯一的阻塞调用是在您调用ѭ0时,并且仅在数千个套接字中的任何一个都没有要处理的情况下才阻塞。事件驱动的框架(例如netty.io)使用此模型,并且已被证明具有很高的可伸缩性,并且可以最佳地使用系统的硬件资源。     ,我说使用Akka之类的方法来管理您的线程。如果没有记错的话,请使用具有非阻塞IO的Jersey http客户端库,它可以与回调一起使用。这可能是此类任务的理想设置。