首页 文章

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

提问于
浏览
1

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

3 回答

  • 0

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

    • 如果消费者以 生产环境 者 生产环境 的方式处理元素,那么添加更多消费者将无济于事

    • 如果消费者是瓶颈,那么增加更多的 生产环境 者就意味着你积累了大量的工作

    • 如果消费者都共享一个已经达到最大限度的资源(例如饱和的网络连接或磁盘),那么添加更多线程将无济于事

    • 如果消费者在共享资源上同步,迫使他们在很长一段时间内以串行方式工作,那么添加更多线程将无济于事

    • 如果消费者受CPU限制,那么你需要帮助

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

    • 工作队列的长度是多少?它会继续增长吗?它总是接近0吗?

    • 您的CPU使用情况如何?网络/磁盘使用情况如何?

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

  • 0

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

  • 3

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

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

相关问题