我必须实现一个生产者消费者场景,其中有一个生产者(比如说P)和N个(比如N = 3)个消费者(比如C1,C2,C3)。现在要求是负载应该在消费者之间共享,C1 : C2 : C3 = 1 : 3 : 6
。这意味着P应该提供10% to C1, 30% to C2 and 60% to C3
,这种分布应该是统一的。
e.g。说P产生10个项目。如果计数器方法与循环法一起应用,那么场景将如下所示
items 1,2,3 goes to C1, C2, C3, // C1 is done here with its 10%
items 4,5,6 goes to C2, C3, C2, // C2 is done here with its 30%
items 7,8,9 goes to C3, C3, C3, // C3 is bearing continuous load
item 10 goes to C3
但是这里的分布并不均匀,C3正在承受连续负载而无法达到目的。
理想分布会有类似
的东西items 1,2,3 goes to C3, C2, C3,
items 4,5,6 goes to C3, C2, C3,
items 7,8,9 goes to C3, C1, C3,
item 10 goes to C2
我试图在这里提供一个假设的例子。在实际场景中,与上面的示例中的10不同,计数不会被预定义。在实际情况中,生产者将继续生产并且是一个永无止境的过程。例如,想象一个收费站有3个收费站C1,C2,C3,其中通过门的车辆数量应该是1 : 3 : 6
的比例,并且分布应该是均匀的。请建议一个有效的算法来实现它。
答案 0 :(得分:1)
一种方法是让制作人生成1到10的随机数,包括1和10。如果数字为1,则项目转到C1。如果数字是2,3或4,则转到C2。如果数字在5-10范围内,则该项目将转到C3。
请注意,这并不能保证每10个项目的分布是完美的,但假设一个相当好的随机数生成器,分布将非常接近1:3:6的大量(成千上万的物品。
答案 1 :(得分:1)
我建议您使用拓扑排序的变体。
c3开始; c2等到c2 = c3 + 1;类似地,c1等到c1 = c2 + 1;
这样,分发将如下:
c3 c3 c2
c1 c3 c2
c3 c2 c3
C3
这只是我提供的一个例子。您可以选择基于类似的逻辑释放消费者