我有以下内容:
- 一个产生随机整数的生产者(大约每分钟一个)。例如:154609722148751
- 一位消费者一一消费这些整数。消耗时间约为 3 秒。
制作人有时会发疯,很快就只制作一种“类型”的人物,然后恢复正常。例如:6666666666666666666666666666666666666666666666675444696 在 1 秒内。
我的目标是尽可能降低不消耗的不同类型的数字。说,在上一个示例中,我有:
- 很多'6'没有消耗
- 一个“7”未消耗
- 一个“5”未消耗
- 三个“4”未消耗
- 一个“9”未消耗
如果我使用简单的 FIFO 算法,我将等待很长时间才能消耗所有“6”。我宁愿“优先考虑”其他数字,然后使用“6”。
这样的算法是否已经存在?(C# 实现是一个加号)
目前,我正在考虑这个算法:
- 每个数字都有一个队列(Q0,Q1,Q2 ...,Q9)
为每个队列顺序出列一项:
private int _currentQueueId; private Queue<T>[] _allQueues; public T GetNextItemToConsume<T>() { //We assume that there is at least one item to consume, and no lock needed var found = false; while(!found) { var nextQueue = _allQueues[_currentQueueId++ % 10]; if(nextQueue.Count > 0) return nextQueue.DeQueue(); } }
你有比这个更好的算法吗?(或任何想法)
NB1:消费过程我没有主导权(也就是说我不能增加消费速度也不能增加消费线程的数量..)(确实无限的消费速度会解决我的问题)
NB2:确切的时间数字不相关,但我们可以假设消费比生产快十倍
NB3:我对制片人的“疯狂”行为没有主导权,实际上这是一种正常(但不那么频繁)的制作行为