5,100,1000?
我猜,“这取决于”,但是在什么?
作为服务器守护程序/服务运行的应用程序有什么共同之处?
什么是硬限制?
鉴于机器可以处理整体工作负载,我如何确定开销会对性能产生影响的线程数?
操作系统之间有什么重要区别?
还应该考虑什么?
我问,因为我想在应用程序中使用线程来组织我的应用程序的子组件,这些子组件不共享数据并且旨在并行执行它们的工作。由于应用程序也会使用线程池来并行化某些任务,我想知道在什么时候我应该开始考虑将要运行的线程数。
我知道n + 1规则是确定同时处理同一任务以获得性能的线程数的准则。但是,我想使用线程,比如可能在更大的范围内使用进程,i。即组织不应互相干扰的独立任务。
在this related question中,有些人建议尽量减少线程数量,因为增加了复杂性。对我来说,似乎线程也可以帮助保持事物排序更有序,并实际上减少干扰。这不正确吗?
答案 0 :(得分:6)
我无法回答你关于“多少是多少”的问题,但我同意你不应该为所有可能的任务使用线程。
用于执行应用程序的最佳线程数量为(n + 1),其中n是计算机/ claster所具有的处理器/核心数量。
您的实际线程数量与n + 1的差异越大,获得的优化程度就越低,并且会在线程计算中浪费您的系统资源。
因此,通常你会为UI使用1个线程,对于某些通用任务使用1个线程,对于某些大型计算任务使用(n + 1)个线程。
答案 1 :(得分:1)
实际上,Ajmastrean有点过时了。引用他自己的link
线程池的默认大小为 每个可用250个工作线程 处理器,1000 I / O完成 线程。中的线程数 线程池可以通过使用来更改 SetMaxThreads方法。
但一般来说,我认为25实际上是收益递减规律(以及程序员跟踪正在发生的事情的能力)开始生效的地方。虽然Max是正确的,但只要所有线程都执行非阻塞计算,n + 1是最佳数字,在现实世界中,我执行的大多数线程任务往往是在具有某种IO的东西上完成的。< / p>
答案 2 :(得分:1)
还取决于您的架构。例如。在NVIDIA GPGPU lib CUDA中你可以同时放置一个8线程的多处理器512线程。您可能会问为什么要为每个标量处理器分配64个线程?答案很简单:如果计算不是计算绑定而是内存IO绑定,则可以通过执行其他线程来隐藏mem延迟。类似适用于普通CPU。我记得对于make“-j”的并行选项的建议是使用大约1.5倍的核心数量。许多编译任务都是沉重的IO负担,如果任务必须等待硬盘,mem ......无论如何,CPU可以在不同的线程上工作。
接下来,您必须考虑任务/线程切换的成本。例如。它是免费的,而CPU必须为上下文切换执行一些工作。因此,通常您必须估计两个任务切换的惩罚是否比线程阻塞的时间长(这在很大程度上取决于您的应用程序)。
答案 3 :(得分:0)
Microsoft的ThreadPool类限制每个处理器25个线程。该限制基于线程之间的context switching和每个线程的memory consumed。所以,如果您使用的是Windows平台,那么这是一个很好的指导。