Laden...

Job-Queue mit Prioritäten

Erstellt von hypersurf vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.289 Views
H
hypersurf Themenstarter:in
523 Beiträge seit 2008
vor 12 Jahren
Job-Queue mit Prioritäten

Hallo Leute,

ich habe einen Windowsdienst in dem 100 Threads laufen und gleichzeitig Datenpakete per FTP an mehrere hundert Computer versenden.

Dazu habe ich die geniale SyncQueue von herbivore verwendet: SyncQueue <T> - Eine praktische Job-Queue
Diese Klasse hat mir einiges an Arbeit abgenommen 👍

Jetzt wurde eine neue Anforderung ein den Dienst gestellt:

Alle Jobs in der SyncQueue haben die Attribute Computer-ID und Priorität. Die Priorität ist ein Integer. 0 stellt eine niedrige Priorität dar, 9 eine hohe.
Beim Abarbeiten der Jobs soll geprüft werden, ob zur sich gleichen Computer-ID noch Jobs mit einer höheren Priorität in der SyncQueue befinden oder ein anderer Thread evtl. gerade einen Job mit höherer Priorität verarbeitet.
Ist dies der Fall, darf der Job mit der niedrigeren Priorität erst verarbeitet werden, wenn der Job mit der höheren Priorität vollständig verarbeitet wurde.

In einem separaten Thread werden ständig weitere Jobs in die Queue gestellt die dann abgearbeitet werden. Diese neuen Jobs können natürlich wieder eine höhere oder niedrigere Priorität haben, als die die schon in der Queue vorhanden sind und auf ihre Abarbeitung warten.

So ist es bisher / So soll es sein:
Siehe Anhang

Lässt sich das mit der SyncQueue bewerkstelligen?
Habt Ihr vielleicht einen Denkanstoss für mich wie sich diese Anforderung vernünftig realisieren lässt? Bin noch relativ unerfahren was Multi-Threading betrifft und wäre für einen Tipp dankbar =)

16.835 Beiträge seit 2008
vor 12 Jahren

Im Prinzip musst Du bei der Queue-Auswahl nicht nach dem First-In-First-Out-Prinzip handeln; sondern Du sortierst quasi die Queue-Elemente absteigend der Priorität und arbeitest sie in dieser Richtung ab.

2.891 Beiträge seit 2004
vor 12 Jahren

Du könntest auch pro Priorität eine separate Queue erstellen und erst die höchstpriorisierte abarbeiten und dann die nächst niedrigere usw.

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 6.1 (Bilder als Dateianhang hochladen)

Hinweis von herbivore vor 12 Jahren

==> repariert, aber dN!3L hat vollkommen Recht: macht das bitte von alleine.

48 Beiträge seit 2010
vor 12 Jahren

Bei diesem Ansatz sollte die Priorität aber mit der Zeit inkrementiert werden, da ansonsten rein theoretisch Jobs mit einer niedrigen Priorität nie ausgeführt würden - das wäre ja schade. 😃

2.891 Beiträge seit 2004
vor 12 Jahren

~~a ansonsten rein theoretisch Jobs mit einer niedrigen Priorität nie ausgeführt würden - das wäre ja schade. 😃
@hypersurf: Ist das nicht auch das Ziel?[/color]

A
764 Beiträge seit 2007
vor 12 Jahren

Du könntest die Priorität von Jobs die lönger warten erhöhen, oder niedriger priorisierte Jobs in Queues mit höherer Priorität verschieben, wenn sie übergangen werden.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo hypersurf,

die SyncQueue um Prioritäten zu erweitern, so wie es auf dem Bild gezeigt ist, sollte relativ einfach sein. Im Grunde muss man ja nur die Queue _q durch eine (eigene) Queue ersetzen, die immer das Element mit der höchsten Prioritäten zuerst zurück gibt. Dann muss man an der Synchronisierung überhaupt nichts ändern.

... ein anderer Thread evtl. gerade einen Job mit höherer Priorität verarbeitet.

Davon weiß die SyncQueue momentan allerdings überhaupt nichts. Wenn man das noch berücksichtigen will, müsste man eine (synchronisierte) Methode zur SyncQueue hinzufügen, mit der man der SyncQueue mitteilen kann, dass die Verarbeitung des Auftrags beendet wurde. Die SyncQueue muss sich dann natürlich alle laufenden Aufträge merken und beim Dequeue berücksichtigen. Nicht mehr ganz so einfach und auch nicht mehr ganz so schön, aber natürlich immer noch machbar.

herbivore

H
hypersurf Themenstarter:in
523 Beiträge seit 2008
vor 12 Jahren

~~a ansonsten rein theoretisch Jobs mit einer niedrigen Priorität nie ausgeführt würden - das wäre ja schade. 😃
@hypersurf: Ist das nicht auch das Ziel?

Ja, das ist das Ziel. Jeder Job mit höherer Priorität sticht einen Job mit niedrigerer Priorität aus.[/color]

Ich denke ich werde den Vorschlag mit der eigenen Queue aufgreifen die immer das Element mit der höchsten Prioritäten zuerst zurück gibt.

Danke für Eure Antworten, die mir sehr geholfen haben 😃