gpt4 book ai didi

java - 如何拥有动态数量的生产者和消费者?

转载 作者:行者123 更新时间:2023-12-02 10:57:54 24 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

简而言之,对于这种问题,您可能应该考虑使用类似 MapReduce 的内容。

关于java - 如何拥有动态数量的生产者和消费者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51578599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com