2

给定一个生产者-消费者问题的实例,其中多个生产者向单个消费者发送消息:当一些消息“同时”到达消费者时,您建议使用哪些技术来避免生产者饥饿。到目前为止,我正在考虑:

  1. 通过采样一些概率分布来选择“非确定性”(不确定如何,考虑到不同数量的消息到达不同的时间戳)。
  2. 在发送 n 条消息后,使用一些计数器并让生产者休眠一段时间。
4

2 回答 2

1

如果你可以有一个优先队列,我认为每个生产者都可以有一个消息发送计数器。并且队列将根据 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
于 2013-03-29T18:36:05.690 回答
0

最简单和最好的方法之一是按照消息到达的顺序处理消息(一个简单的 FIFO 列表就可以了)。即使多条消息同时出现也没关系。通过这种方式,没有一个生产者会挨饿。

我要确保的一件事是消费者比生产者消费消息的速度更快。如果不是这样,它可能最终导致生产者等待消费者,并且为单个消费者拥有多个生产者不会有任何优势。

于 2013-03-29T18:17:40.740 回答