通常我被告知WorkStealingPool实现了工作窃取算法,这有助于平衡线程的工作负载。但我不认为FixedThreadPool是不平衡的。在我看来,从阻塞队列中轮询一个过时任务的每个线程都是平衡的。WorkStealingPool比FixedThreadPool有什么优势吗?如果任务不是递归的,我是否可以说我永远不应该考虑工作窃取?
8hhllhi21#
但我不认为FixedThreadPool是不平衡的。在我看来,从阻塞队列中轮询一个过时任务的每个线程都是平衡的。当任务数量比线程数量大得多时,平均来说,这是相当好的平衡。当线程的数量除以任务的数量并且每个任务花费的时间大致相同时,它也是很好的平衡。在其他情况下,FixedThreadPool的工作可能不会很好地平衡。极端情况是,当池中有多个线程但只有一个任务时,一个线程完成所有工作,而其他线程处于空闲状态。WorkStealingPool相对于FixedThreadPool的任何优势,是的。对于可以进行适当结构化的任务,平均而言,工作窃取池可以将总体工作更均匀地分布在池的多个线程上。如果任务不是递归的,我是否可以说我永远都不应该考虑工作窃取?你可以说任何事,但那并不意味着它就是这样。对于那些实现分治方法的人来说,构建任务以支持工作窃取是非常容易的,这种方法通常是递归的,但它并不依赖于任务是递归的。更准确地说,除非任务的任何部分工作可以在多个并发运行的子任务中分配,否则永远不应该考虑工作窃取。
FixedThreadPool
1条答案
按热度按时间8hhllhi21#
但我不认为FixedThreadPool是不平衡的。在我看来,从阻塞队列中轮询一个过时任务的每个线程都是平衡的。
当任务数量比线程数量大得多时,平均来说,这是相当好的平衡。当线程的数量除以任务的数量并且每个任务花费的时间大致相同时,它也是很好的平衡。
在其他情况下,
FixedThreadPool
的工作可能不会很好地平衡。极端情况是,当池中有多个线程但只有一个任务时,一个线程完成所有工作,而其他线程处于空闲状态。WorkStealingPool相对于FixedThreadPool的任何优势,
是的。对于可以进行适当结构化的任务,平均而言,工作窃取池可以将总体工作更均匀地分布在池的多个线程上。
如果任务不是递归的,我是否可以说我永远都不应该考虑工作窃取?
你可以说任何事,但那并不意味着它就是这样。对于那些实现分治方法的人来说,构建任务以支持工作窃取是非常容易的,这种方法通常是递归的,但它并不依赖于任务是递归的。
更准确地说,除非任务的任何部分工作可以在多个并发运行的子任务中分配,否则永远不应该考虑工作窃取。