间隔分区的生产者-消费者
Producer-consumer with interval partitioning
我有一个有趣的生产者-消费者分拆要实施,但我无法全神贯注于它的算法。因此,每个 生产者 将“产生”给定范围(最小值、最大值)之间的数字,这同样提醒除以给定“商”。 消费者.
也是如此
额外要求:有限缓冲区。
我对此的看法:
- 粗粒度队列使用锁和推送和弹出的两个条件,以及一些预期方和到达方,用于确定队列是否仍可供消费者使用。 (如果队列中仍有项目或有活跃的作者(到达!=预期),则认为队列可用)
- 一个“Producer class”,它包含最小值、最大值、商和共享队列作为字段,并具有根据给定字段生成 returns 值的方法。
- 一个“消费者”class,它包含与“生产者”class相同的字段,并具有方法“消费”,它从队列中弹出一个项目并“消费”(打印它出)它。只要队列可用,消费者就会消费。
我的问题:
- 如何确保 x 个生产者和 y 个消费者 (x != y) 生产和消费给定工作负载间隔(开始、结束)之间的所有数字?
- 如何实现消费机制?
- 如何对生产者和消费者的值进行分区,以便使用工作负载间隔的所有值?
我正在考虑为“缓冲区”使用数组列表,并且每个消费者都会执行无锁查找以查找要使用的“兼容”元素,如果元素可用则删除该元素,或者如果 [=56 则重试=]可用。我认为这会很低效,因为在“尝试”上浪费了 CPU 个周期。
PS:我用的是java,但是伪代码也很好。
提前致谢!
要确保生产者从给定范围内生成具有相同余数的所有数字,您可以使用以下伪代码
int current = start;
while (current++ <= end) { //assuming your ranges are inclusive
if (current % quotient == 0) {
publish(current);
}
}
要支持分区,您基本上需要某种 Map<YourKey, Queue>
。每个生产者和消费者都将与一个键关联,生产者将发布到与其键关联的队列,消费者将从与其键关联的队列中消费。您可以将您的范围用作队列的键。
我有一个有趣的生产者-消费者分拆要实施,但我无法全神贯注于它的算法。因此,每个 生产者 将“产生”给定范围(最小值、最大值)之间的数字,这同样提醒除以给定“商”。 消费者.
也是如此额外要求:有限缓冲区。
我对此的看法:
- 粗粒度队列使用锁和推送和弹出的两个条件,以及一些预期方和到达方,用于确定队列是否仍可供消费者使用。 (如果队列中仍有项目或有活跃的作者(到达!=预期),则认为队列可用)
- 一个“Producer class”,它包含最小值、最大值、商和共享队列作为字段,并具有根据给定字段生成 returns 值的方法。
- 一个“消费者”class,它包含与“生产者”class相同的字段,并具有方法“消费”,它从队列中弹出一个项目并“消费”(打印它出)它。只要队列可用,消费者就会消费。
我的问题:
- 如何确保 x 个生产者和 y 个消费者 (x != y) 生产和消费给定工作负载间隔(开始、结束)之间的所有数字?
- 如何实现消费机制?
- 如何对生产者和消费者的值进行分区,以便使用工作负载间隔的所有值?
我正在考虑为“缓冲区”使用数组列表,并且每个消费者都会执行无锁查找以查找要使用的“兼容”元素,如果元素可用则删除该元素,或者如果 [=56 则重试=]可用。我认为这会很低效,因为在“尝试”上浪费了 CPU 个周期。
PS:我用的是java,但是伪代码也很好。
提前致谢!
要确保生产者从给定范围内生成具有相同余数的所有数字,您可以使用以下伪代码
int current = start;
while (current++ <= end) { //assuming your ranges are inclusive
if (current % quotient == 0) {
publish(current);
}
}
要支持分区,您基本上需要某种 Map<YourKey, Queue>
。每个生产者和消费者都将与一个键关联,生产者将发布到与其键关联的队列,消费者将从与其键关联的队列中消费。您可以将您的范围用作队列的键。