Laden...

Gutes Beispiel für JobQueue

Erstellt von bl4ckY vor 14 Jahren Letzter Beitrag vor 14 Jahren 783 Views
B
bl4ckY Themenstarter:in
193 Beiträge seit 2009
vor 14 Jahren
Gutes Beispiel für JobQueue

Hallo,

habe leider weder beim googlen noch hier im Forum durch die Suche ein vernünftiges Beispiel gefunden. Hat vielleicht irgendeiner ein Artikel o.ä zum Thema Jobs/JobQueue.

hier ist ein Beispiel.

Habe hier aber noch das Problem das ich einfach nicht verstehen will wo der Code vom Job ausgeführt wird?

Mein Vorhaben: Ich will das ein Server eine JobQueue durchläuft und bestimmte Sachen an bestimmte Clients sendet. Zwischenspeichern wollte ich den ClientNamen (daraus leite ich die IP ab) und das zu sende Zeug.

Wie soll ich das realisieren?

Am schönsten wäre noch ein weiteres verständliches Beispiel. Aber ich finde einfach keins.

H
81 Beiträge seit 2008
vor 14 Jahren

Ich hab schon mal was ähnliches programmiert. Ich habe eine Collection verwendet in der ich die verschiedenen Jobs verwalte. Die Job-Objekte die in der Collection liegen feuern ein Event wenn sie fertig sind. Sobald das Event gefeuert wird kann der nächste Job gestartet werden. Bevor der neue Job jedoch gestartet wird entferne ich das fertige Objekt wieder aus der Collection.

Ist zwar etwas vereinfacht dargestellt aber im Prinzip ist das erst mal das Grundgerüst auf dem man aufbauen kann.

Gelöschter Account
vor 14 Jahren

eine job queue ist einfach eine standard queue in der objekte liegen, die alle daten beinhalten, die für die ausführung einer bestimmten aufgabe notwendig sind. hast du also eine queue mit 3 elementen, dann hat diese queue 3 jobs gespeichert.
üblicherweise hat man dann einen thread, der sich ein solches objekt von dort holt und daraufhin sein job tut. sobald er fertig ist, holt er sich das nächste element.... usw.

sind keine daten mehr vorhanden legt sich der thread schlafen oder beendet sich. sind keine elemente drinn, und es wir ein neues element hinzugefügt, muss der schlafende thread geweckt werden oder ein neuer thread erzeugt werden.

jobqueue ist also eine bezeichnung für den typ und dessen verwendung. queue ist von daher interessant für diese aufgabe da diese das first in first out prinzip verfolg. weitere variationen sind hierfür z.b. die prirorityqueue, die zusätzlich zu den elementen auch dessen priorität speichert und so jobs mit höherer priorität entgegen den first in first out prinzips durchschleusen kann.

B
bl4ckY Themenstarter:in
193 Beiträge seit 2009
vor 14 Jahren

Es hat aber keiner ein kleines Beispiel?

Jack3 von dir habe ich ja den Tipp. Du meintest ich soll eine Sammelqueue bauen und von dort ueber einen weiteren Thread an die jeweiligen Jobqueue der Client verteilen. Nun steh ich vor dem Problem das ich nicht weiss wie ich die JobQueue so baue das sie dem Client eindeutig zuweisbar ist. Im Prinzip müsste ich es über den Namen machen nur wie?

H
81 Beiträge seit 2008
vor 14 Jahren

Nun steh ich vor dem Problem das ich nicht weiss wie ich die JobQueue so baue das sie dem Client eindeutig zuweisbar ist. Im Prinzip müsste ich es über den Namen machen nur wie?

Den Namen einfach in einer Variable des Job-Objekts ablegen? Die Queue enthält ja mehr als nur einen Job. Daher muss jeder Job seinen Client selber kennen. Wenn du aus dem Namen die IP ableiten kannst dann hast du die Zuordnung zum Client.

PS: soweit ich das sehe reicht dir eine Queue vollkommen aus. Alle Daten des Jobs kannst du ja problemlos in einem Objekt ablegen.

B
bl4ckY Themenstarter:in
193 Beiträge seit 2009
vor 14 Jahren

Werde es erstmal mit einem versuchen. Danke für die Hilfe.

Gelöschter Account
vor 14 Jahren

@HeRaider

so würde man es im einstufigen system lösen. wobei hier nicht über den namen gegangen werden soll, sondern besser über ein clientobjekt (am besten über das objekt das für die kommunikation zum client hin verantwortlich ist)

im vorgeschlagenen mehrstufigen system (bei vielen jobs und vielen clients ist das besser), ist eine sammelqueue, die erstmal alles sammelt, ein verteilerthread der je client eine queue versorgt und je clientqueue ein jobthread, der dann die konkrete abarbeitung des jobs übernimmt, angebrachter. so macht man das vor allem bei vielprozessorsystemen, die viele hardwarethreads haben.

allerdings habe ich vor kurzem festgestellt, das windows systeme aktuell maximal 32 bzw 64 (64 bit os) hardwarethreads unterstützen. daher ist es in c# unter einsatz des .net frameworks (was ja an windows gebunden ist) nicht sinnvoll das zweistufige system zu verwenden.

also, im .net framework gibt es für das einstufige system bereits etwas fix und fertiges: der "ThreadPool". schau mal in die msdn nach diesem, da findest du ein gutes beispiel.

edit: bei multicoresystemen hat man sowieso nur maximal 8 hardwarethreads (z.b. 2 quadcore cpu´s)

H
81 Beiträge seit 2008
vor 14 Jahren

wobei hier nicht über den namen gegangen werden soll, sondern besser über ein clientobjekt (am besten über das objekt das für die kommunikation zum client hin verantwortlich ist)

Ok das ist besser als der Name.

Ich selber verwende auch eine 2-stufige Queue. Hab ehrlich gesagt noch keine einstufige verwendet weil das gar nicht in mein Konzept passen würde. Eine Umstellung meiner Queue wäre viel zu viel Aufwand. Kommt vielleicht mal in ein paar Jahren. Momentan läufts auch so sehr gut.

ist eine sammelqueue, die erstmal alles sammelt, ein verteilerthread der je client eine queue versorgt und je clientqueue ein jobthread, der dann die konkrete abarbeitung des jobs übernimmt, angebrachter. So in etwa arbeitet mein Programm momentan.