考虑到生产者 - 消费者问题的一个实例,其中多个生产者向单个消费者发送消息:当消息的一些到达时,您推荐什么技术来避免生产者饿死“同时”给消费者。直到现在我正在考虑:几个生产者,一个消费者:避免饥饿
- 通过抽样一些概率分布(不知道如何,考虑到不同数量的消息到达不同的时间戳),选择“非确定性”。
- 使用一些计数器,并让制片人在发送n条消息后睡一会儿。
考虑到生产者 - 消费者问题的一个实例,其中多个生产者向单个消费者发送消息:当消息的一些到达时,您推荐什么技术来避免生产者饿死“同时”给消费者。直到现在我正在考虑:几个生产者,一个消费者:避免饥饿
最简单也是最好的方法之一是按照它们到达的顺序处理消息(一个简单的FIFO列表可以做到这一点)。即使多条消息同时发送也没关系。通过这种方式,没有一个生产者会饿死。
我会确定的一件事是消费者比生产消息的消费者更快地消费消息。如果不是这样,它可能最终会在生产者等待消费者,并且在为单个消费者提供多个生产者方面没有任何优势。
感谢您的回复。不幸的是他们会。考虑一个制片人超级快,另一个超级慢。它应该是慢速永远不会有机会被消耗。 – user1377000
另外,想想你的第二种方法,我想这将很难找到理想的值为“n” – veda
如果你可以有一个优先级队列,我认为每一个生产者可以有一个消息发送计数器。队列将根据messageSent号码和日期进行排序,这样,如果发送的号码小于另一个邮件,则应该在另一个邮件之前发送邮件。
在Java
class Message { //or you can implement Comparable<Message>
final Date created = new Date();
final int messageNumber;
public Message(int m){this.messageNumber = m;}
}
BlockingQueue<Message> queue = new PriorityBlockingQueue<Message>(new Comparator(){
public int compare(Message m1, Message m2){
if(m1.messageNumber < m2.messageNumber) return 1;
if(m2.messageNumber < m1.messageNumber) return -1;
if(m1.messageNumber == m2.messageNumber) return m1.created.compareTo(m2.created);
}
});
class Provider{
int currentMessage = 0;
void send(){
queue.offer(new Message(currentMessage++));
}
}
因此,如果生产者增加1 5种元素的队列(第一)和制片人2加1,队列将有
P1: 5
P1: 4
P1: 3
P1: 2
P2: 1
P1: 1
很难想象你有一个互斥实现这也没有提供最低程度的公平保证。如果这是你使用的问题,那就把它扔掉。 –