假设我有一个处理100万句话的任务.
对于每个句子,我需要对它做一些事情,无论处理它们的具体顺序如何.
在我的Java程序中,我有一组从我的主要工作块中划分出来的一组未来,它用一个可调用来定义要在一大块句子上完成的工作单元,我正在寻找一种优化线程数量的方法分配工作通过大块的句子,然后重新组合每个线程的所有结果.
在我看到收益递减之前,我可以使用的最大线程数是多少?
另外,是什么原因导致逻辑分配的线程越多,即一次完成的线程越多,就越不正确?
解决方法
在实践中,可能很难找到最佳线程数,甚至每次运行程序时该数字都可能会有所不同.因此,理论上,最佳线程数将是您机器上的核心数.如果您的核心是“超线程”(如英特尔所说),它可以在每个核心上运行2个线程.然后,在这种情况下,最佳线程数是计算机上核心数的两倍.
Also,what causes the logic that the more threads allocated,i.e. more being able to be done at once,to be incorrect?
分配更多线程导致同时完成更多工作的原因是错误的,因为只有1个(如果核心是“超线程”的话,只有2个线程)可以在每个核心上一次运行.
所以假设我有一个不是超线程的四核机器.在这种情况下,我可以同时运行最多4个线程.所以,我的最大吞吐量应该用4个线程来实现.假如我尝试在同一设置上运行8个线程.在这种情况下,内核将来回调度这些线程(通过上下文切换),并阻止一个线程以便让另一个线程运行.因此,最多可以一次运行4个线程的工作.
有关这方面的更多信息,使用Linux内核查找“上下文切换”非常有用.这将为您提供有关此主题的所有信息.
另请注意,称为“用户级线程”和“内核级别线程”的线程之间存在差异.如果您进一步研究这个主题,这是一个重要的区别,但它超出了这个问题的范围.