如何具有动态的生产者和消费者数量?

时间:2018-07-29 08:34:07

标签: java concurrency producer-consumer

有一个使用生产者和消费者模式实现的程序。生产者根据查询列表从db获取数据,并将其放入数组阻塞队列中。使用者根据数组阻塞队列中的数据准备excel报告。为了提高性能,我希望动态地增加生产者和消费者的数量。例如,当生产者缓慢时,有更多的生产者数量。.当消费者缓慢时,有更多的消费者数量。我如何才能拥有充满活力的生产者和消费者?

1 个答案:

答案 0 :(得分:1)

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

  • 您如何确保多个并行生产者以正确的顺序将项目放入队列?这可能或不可能-取决于您要处理的问题的类型。
  • 您将如何确保多个并行使用方不会从队列中“窃取”对方的商品?同样,这取决于您的问题,在某些情况下这可能是理想的,而在其他情况下则是禁止的。您没有提供足够的信息,但是通常情况下,如果您准备报告数据,则将需要一个使用者来等待报告数据完成。
  • 这真的可以实现任何提速吗?您实际上是在衡量生产者方面I / O的瓶颈吗?还是只是假设?如果瓶颈是CPU限制,您将一事无成。

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

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

简而言之,这是一种问题,您可能应该考虑使用类似MapReduce

的问题。