Laden...

Rechenleistung unter den Threads aufteilen: Job-Queue soll Prioritäten unterstützen

Erstellt von BiGfReAk vor 10 Jahren Letzter Beitrag vor 10 Jahren 962 Views
B
BiGfReAk Themenstarter:in
6 Beiträge seit 2014
vor 10 Jahren
Rechenleistung unter den Threads aufteilen: Job-Queue soll Prioritäten unterstützen

Hallo

ich habe eine Anwendung die mit 4 Threads diverse Webseiten abruft. Das Problem was ich habe ist, dass ein Thread immer extrem viel macht, während die anderen kaum zum Zuge kommen. Nun wollte ich das ganze mit einer Art Queue lösen, wo sich die Threads einreihen und einer nach dem anderen ein Request verschickt.
Allerdings muss die Queue auch Prioritäten unterstützen. Also wenn ein Thread ankommt und sagt es ist ganz dringend, dann muss er sofort dran kommen.
Kennt ihr eine Möglichkeit sowas umzusetzen? Ich habe schon nach lock, Semaphore usw geguckt, aber davon scheint alles nicht zu passen, weil sie entweder keine Queue bieten oder keine Priorität.
Die Threads laufen quasi endlos, bis ich sie von Hand stoppe (also mit nem Button).

// Edit: Das mit der Priorität brauchen ich aus folgendem Grund: Wenn eine bestimmte Antwort kommt, dann muss dieser Thread direkt eine weitere Anfrage verschicken. Also das Programm muss alles stehen und liegen lassen und dieser Thread muss sofort reagieren können.

D
216 Beiträge seit 2009
vor 10 Jahren

Wenn es nur 2 verschiedene Prioritäten gibt, dann ist das einfachste mit 2 Queues zu arbeiten, einen für die wichtigen Requests und einen für die normalen. Wenn es Requests im "wichtigen" Queue gibt, dann nimmt sich der Thread diesen, ansonsten einen aus dem "normalen" Queue.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo BiGfReAk,

du kannst SyncQueue <T> - Eine praktische Job-Queue als Basis verwenden, aber statt der internen Standard-Queue nimmst du eine beliebige Implementierung einer unsynchronisierte Queue mit Prioritäten. Sowas findest du im Netz oder kannst es relativ einfach selbst implementieren.

Wenn du allerdings wirklich willst, dass der wichtige Auftrag sofort bearbeitet wird, also ohne dass darauf gewartet werden muss, dass einer der gerade laufenden (vier) Aufträge beendet ist, hilft es aus meiner Sicht nur, einen neuen Thread mit höherer Priorität zu starten. Einen der laufenden Aufträge abzubrechen, damit einer der bestehenden Threads den Auftrag sofort ausführen kann, halte ich für zu unpraktikabel und fehleranfällig.

herbivore

B
BiGfReAk Themenstarter:in
6 Beiträge seit 2014
vor 10 Jahren

Dankeschön, auf den ersten Blick sieht es so aus als ginge es in die Richtung was ich brauche. Ich bastel später mal was rum.