Hi,
In der Praxis hat es sich gezeigt, dass eine BlockingQueue immer fast voll oder fast leer ist. D.h. entweder werden Producer oder Consumer geblockt bzw. koennen nicht soviel Arbeit verrichten wie theoretisch moeglich.
Wenn man den Thread-Pool und die Queue enger verzahnt koennte man dem doch Abhilfe schaffen fuer bestimmte Arten von Arbeit (klappt nicht in allen Szenarien).
Ein Beispiel: Producer lesen eine Datei ein, parsen diese und generieren eine Berechnung die in die Queue gelegt wird. Producer nehmen diese Berechnung und fuehren sie aus.
Abhaengig von der Art der Dateien, der Auslastung der HDD, der Aufwaendigkeit der Berechnung und vielen weiteren Faktoren koennen manchmal die Consumer und manchmal die Producer schneller arbeiten. Die Queue ist also gestopft voll, oder praktisch leer.
Wuerde die Anzahl der Producer verringert und die Anzahl der Consumer erhoeht wenn die Queue fuer einige Zeit voll ist, waere der Durchsatz hoeher.
Wuerde die Anzahl der Producer erhoeht und die Anazahl der Consumer verringert wenn die Queue praktisch leer ist, koennte der Durchsatz ebenfalls erhoeht werden.
Eine Loesung aus eng verzahnter Thread-Pool und Queue koennte
1. die Absolute Zahl von Threads (Producer + Consumer) angepasst werden - z.B. wenn der Rechner ausgelastet ist.
2. die Anzahl der Producer und die Anzahl der Consumer Threads dynamisch angepasst werden.
Start: 12 Producer, 12 Consumer (Queue voll)
Update: 6 Producer, 18 Consumer (Queue immer noch voll)
Update: 3 Producer, 21 Consumer (Queue und Worker threads arbeiten optimal)
...
...
...
Situation hat sich geaendert. Queue ist praktisch leer.
Update: 6 Producer, 18 Consumer (Queue ist immer noch leer)
Update: 9 Producer, 15 Consumer (Queue und Worker threads sind optimal ausgelastet)
Gibt es solcher Loesungen? Spricht was dagegen?
In der Praxis hat es sich gezeigt, dass eine BlockingQueue immer fast voll oder fast leer ist. D.h. entweder werden Producer oder Consumer geblockt bzw. koennen nicht soviel Arbeit verrichten wie theoretisch moeglich.
Wenn man den Thread-Pool und die Queue enger verzahnt koennte man dem doch Abhilfe schaffen fuer bestimmte Arten von Arbeit (klappt nicht in allen Szenarien).
Ein Beispiel: Producer lesen eine Datei ein, parsen diese und generieren eine Berechnung die in die Queue gelegt wird. Producer nehmen diese Berechnung und fuehren sie aus.
Abhaengig von der Art der Dateien, der Auslastung der HDD, der Aufwaendigkeit der Berechnung und vielen weiteren Faktoren koennen manchmal die Consumer und manchmal die Producer schneller arbeiten. Die Queue ist also gestopft voll, oder praktisch leer.
Wuerde die Anzahl der Producer verringert und die Anzahl der Consumer erhoeht wenn die Queue fuer einige Zeit voll ist, waere der Durchsatz hoeher.
Wuerde die Anzahl der Producer erhoeht und die Anazahl der Consumer verringert wenn die Queue praktisch leer ist, koennte der Durchsatz ebenfalls erhoeht werden.
Eine Loesung aus eng verzahnter Thread-Pool und Queue koennte
1. die Absolute Zahl von Threads (Producer + Consumer) angepasst werden - z.B. wenn der Rechner ausgelastet ist.
2. die Anzahl der Producer und die Anzahl der Consumer Threads dynamisch angepasst werden.
Start: 12 Producer, 12 Consumer (Queue voll)
Update: 6 Producer, 18 Consumer (Queue immer noch voll)
Update: 3 Producer, 21 Consumer (Queue und Worker threads arbeiten optimal)
...
...
...
Situation hat sich geaendert. Queue ist praktisch leer.
Update: 6 Producer, 18 Consumer (Queue ist immer noch leer)
Update: 9 Producer, 15 Consumer (Queue und Worker threads sind optimal ausgelastet)
Gibt es solcher Loesungen? Spricht was dagegen?
Zuletzt bearbeitet: