考慮到生產者 - 消費者問題的一個實例,其中多個生產者向單個消費者發送消息:當消息的一些到達時,您推薦什麼技術來避免生產者餓死「同時」給消費者。直到現在我正在考慮:幾個生產者,一個消費者:避免飢餓
- 通過抽樣一些概率分佈(不知道如何,考慮到不同數量的消息到達不同的時間戳),選擇「非確定性」。
- 使用一些計數器,並讓製片人在發送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
很難想象你有一個互斥實現這也沒有提供最低程度的公平保證。如果這是你使用的問題,那就把它扔掉。 –