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.
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.
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.
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?
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.
@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)
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.