增加线程数量会使生产者消费者的问题变得更快吗?

时间:2012-10-11 06:10:02

标签: java multithreading synchronization producer-consumer blockingqueue

我使用无界链接阻塞队列实现了类似于消费者 - 生产者问题的东西。我让生产者把对象放到队列中,消费者把它拿走。当我测试程序时,每次试验的线程数增加一倍,同时仍然处理相同数量的对象,所有试验的时间似乎是不变的。这是假设是不变的吗?或更多线程意味着更快的处理?不确定是否是我的代码导致共享资源的缓慢或同步。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

这完全取决于瓶颈是什么:

  • 如果消费者在生产者生产过程中处理元素的速度很快,那么添加更多消费者将无法提供帮助
  • 如果消费者是瓶颈,那么增加更多的生产者只会意味着你积压了大量的工作
  • 如果消费者都共享一个已经达到最大限度的资源(例如饱和网络连接或磁盘),那么添加更多线程将无法帮助
  • 如果消费者在共享资源上进行同步,强制他们在大部分时间内以串行方式工作,那么添加更多线程将无法提供帮助
  • 如果消费者受CPU限制并且您已经有足够的线程来最大化您的CPU使用率,那么添加更多线程将无法提供帮助

您需要查看程序运行时发生的事情:

  • 工作队列的长度是多少?它会继续增长吗?是否总是接近0?
  • 您的CPU使用情况如何?网络/磁盘使用情况怎么样?

然后分析您的代码正在做什么,并找出您期望问题的并行化程度

答案 1 :(得分:0)

可能是您的同步。假设您的单个队列一次仅消耗一个项目,在您消费或生产时阻止其他消费者,那么如果您想要更多吞吐量,则需要更多队列。

答案 2 :(得分:0)

这是一个组合,你必须尝试找到一个接近最优的解决方案。让我们从一个核心系统开始吧。在那里你必须找到等待的平衡(通常是IO)和计算时间。你可以根据你在做什么来使两者饱和。例如,如果您受磁盘速度的限制,则无法通过添加更多线程获得任何收益。相反,您可能会陷入磁盘调度并且性能会降低。另一方面,如果您从不等待IO,那么您的工作就处于另一个极端,您将无法通过在单个核心处理器上添加更多线程来获得任何收益。

在多核系统上,只要您不等待IO,就可以增加线程数以提高性能。更多内核对您没有帮助。但与IO一样,添加线程会产生开销,所以不要太高。