【问题标题】:Producer-consumer with interval partitioning具有区间划分的生产者-消费者
【发布时间】:2019-06-19 15:21:16
【问题描述】:

我有一个有趣的生产者-消费者衍生产品要实现,我无法完全理解它的算法。因此,每个 生产者 都会在给定范围(最小值、最大值)之间“生成”数字,这会同样提醒除以给定的“商”。 消费者也是如此。

额外要求:有限缓冲区。

我对此的看法:

  • 使用锁和两个条件进行推送和弹出的粗粒度队列以及用于确定队列的预期方和到达方的数量仍然可供消费者使用。 (如果队列中仍有项目或有活动的写入者(到达!= 预期),则认为队列可用)
  • 一个“生产者类”,其中包含最小值、最大值、商和共享队列作为字段,并具有根据给定字段生成和返回值的方法。
  • 一个“Consumer”类,它包含与“Producer”类相同的字段,并具有“consume”方法,该方法从队列中弹出一个项目并“使用”(打印出来)它。只要队列可用,消费者就会消费。

我的问题:

  • 如何确保给定工作负载间隔(开始、结束)之间的所有数字都将由 x 个生产者和 y 个消费者 (x != y) 生产和消费?
  • 如何实现消费机制?
  • 如何对生产者和消费者的值进行分区,以便使用工作负载间隔的所有值?

我正在考虑为“缓冲区”使用数组列表,每个消费者都会执行无锁查找以查找要使用的“兼容”元素,如果一个元素可用则删除一个元素,如果没有可用元素则重试。我认为这将是低效的,因为“尝试”会浪费 CPU 周期。

PS:我正在使用 java,但伪代码也很好。

提前致谢!

【问题讨论】:

    标签: java concurrency partitioning producer-consumer java-threads


    【解决方案1】:

    为确保生产者生成给定范围内具有相同余数的所有数字,您可以使用以下伪代码

    int current = start;
    while (current++ <= end) { //assuming your ranges are inclusive
      if (current % quotient == 0) {
        publish(current);
      }
    }
    

    要支持分区,您基本上需要某种Map&lt;YourKey, Queue&gt;。每个生产者和消费者都将与一个密钥相关联,生产者将发布到与其密钥相关联的队列,消费者将从与其密钥相关联的队列中消费。您可以将您的范围用作队列的键。

    【讨论】:

    • 这是个好主意,不幸的是,我最多可以使用 1 个缓冲区。
    • 我看到的唯一要求是额外要求:有限缓冲区。。从技术上讲,您可能有多个累积大小不超过预定义值的缓冲区。
    • 所以您建议我可以将单个较大的缓冲区拆分为多个较小的缓冲区。这可能真的有效。但是我如何为 555 个消费者和 1996 个生产者共享缓冲区?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多