【问题标题】:How to have dynamic number of producers and consumers?如何拥有动态的生产者和消费者数量?
【发布时间】:2018-07-29 08:34:06
【问题描述】:

有一个程序是使用生产者和消费者模式实现的。生产者根据查询列表从数据库中获取数据并将其放入数组阻塞队列中......消费者根据数组阻塞队列中的数据准备excel报告。为了提高性能,我想要动态的生产者和消费者数量。例如,当生产者速度慢时,生产者数量更多。当消费者速度慢时,消费者数量更多。我怎样才能拥有动态的生产者和消费者??

【问题讨论】:

  • 您尝试过什么,遇到过什么问题?您可以根据需要创建更多或停止现有的生产者/消费者的数量,就像现在开始/停止它们一样。

标签: java concurrency producer-consumer


【解决方案1】:

如果你这样做,你必须先问自己几个问题:

  • 您将如何确保多个并行生产者以正确的顺序将项目放入队列中?这可能会也可能不会 - 这取决于您要处理的问题类型。
  • 如何确保多个并行消费者不会从队列中“窃取”彼此的项目?同样,这取决于您的问题,在某些情况下这可能是可取的,而在其他情况下则被禁止。您没有提供足够的信息,但通常如果您准备报告数据,您将需要一个消费者并等待报告数据完成。
  • 这真的会实现任何加速吗?您是否真的测量出瓶颈是生产者端的 I/O 限制,还是只是假设?如果瓶颈受 CPU 限制,您将一无所获。

因此,假设您需要完整的报告数据(即需要完整数据的单一消费者),并且您的数据可以“分片”到独立的子集,并且瓶颈实际上就是您认为的那样,你可以这样做:

  1. 由于多个生成器将生成结果的不同部分,它们不会是连续的。所以列表不是一个好的选择;您将需要一个数据结构,您可以在其中存储临时结果并关心哪些范围已经完成,哪些范围仍然缺失。可能,您可以为每个生产者使用一个列表作为缓冲区,并拥有一个“合并”线程,该线程将写入单个输出列表以供消费者使用。
  2. 您需要将输入数据拆分为多个输入片段(每个生产者一个)
  3. 您需要以某种方式跟踪订购并确保消费者以正确的顺序取出商品
  4. 您可以在第一个输出块出来的那一刻开始消费者
  5. 您必须在生产完最后一块时停止消费者。

简而言之,这是一个你应该考虑使用类似MapReduce的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多