multithreading - 几个生产者,一个消费者: Avoid starvation

标签 multithreading concurrency producer-consumer

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

  • 通过对某些概率分布进行采样来“不确定地”选择(不确定如何,因为在不同的时间戳上到达了不同数量的消息)。
  • 使用一些计数器,使生产者在发送n条消息后进入休眠状态。
  • 最佳答案

    如果您可以拥有一个优先级队列,我认为每个生产者都可以向计数器发送一条消息。队列将根据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
    

    关于multithreading - 几个生产者,一个消费者: Avoid starvation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15708380/

    相关文章:

    c++ - 多生产者/消费者绩效

    c - 使用条件变量(c、gcc)时的意外行为

    sql - 多列的 SELECT 和 INSERT 之间的竞争条件

    concurrency - gunicorn uvicorn worker.py 如何遵守 limit_concurrency 设置

    java - java中的notifyAll

    algorithm - 有人可以用 P V 形式解释生产者和消费者吗?

    java - 使用Java同时调用多个Web服务

    java-nio : send from different thread than selecting

    java - Java 中的 ConcurrentHashMap 中的重新散列会增加段数吗?

    .net - 如何编写生产者-消费者问题解决方案的测试?