2015-12-25 10 views
5

Ich habe eine interessante Übung von meinem Professor zu lösen. Aber ich brauche ein bisschen Hilfe, damit es in den Ferien nicht langweilig wird.Wie kann ich mit dem Erstellen eines Multithread-Lastenausgleichs beginnen?

Die Bewegung ist zu

  • einen multithreaded Load Balancer erzeugt, dass jeder zweiten Messpunkt 1 aus 5-Sensoren liest. (also 5 Werte pro Sekunde).
  • Dann machen Sie einige "komplexe" Berechnungen mit diesen Werten.
  • Ergebnisse der Berechnungen auf dem Bildschirm drucken. (wie Max Wert oder Durchschnittswert von Sensor 1-5 und so weiter, natürlich Multithread)
  • Als zusätzliche Aufgabe muss ich auch sicherstellen, dass, wenn in Zukunft zum Beispiel 500 Sensoren jede Sekunde gelesen werden würde, der Computer nicht Beenden Sie den Job (Load Balancing).

Ich habe eine CSV-Textdatei mit ~ 400 Messstellen von 5 imaginären Sensoren.

Was ich glaube, ich habe zu tun:

  1. Lesen Sie die Messpunkte in einem Array
  2. zu diesem Array Thread sicheren Zugang Stellen Sie sicher,
  3. Spawn ein neuer Thread für jeden Wert, der einige Sachen Mathematik berechnet

ich bin ein Maximalwert für maximale Anzahl gleichzeitiger Arbeitsfäden Setzen Sie neue applicatio auf Multithreading ns in C#, aber ich denke, Threadpool ist der richtige Weg. Ich arbeite gerade an einer Warteschlange und starte sie möglicherweise in einer Aufgabe, damit sie die Anwendung nicht blockiert.

Was würden Sie empfehlen?

+0

Haben Sie für jeden Sensor unabhängig Mittelwerte beabsichtigen, berechnen max, beschäftigen möchten? – alexm

+0

Ja, das ist das "Design". es sollte irgendwie mit zunehmenden Sensoren skalieren aber sollte den Prozessor nicht töten .... –

+0

oder wichtiger: sollte die Anwendung und seine Funktion nicht –

Antwort

3

Es gibt ein paar Umgebung hier Abhängigkeiten:

  • Welche Version von .NET verwenden Sie?
  • Welche UI verwenden Sie - Desktop (WPF/WinForms) oder ASP.NET?

Nehmen wir an, es ist .NET 4.0 oder höher und eine Desktop-App.

das Lesen der Sensoren

In einer WPF oder WinForms-Anwendung, würde ich eine einziges BackgroundWorker verwenden, um Daten von den Sensoren zu lesen. 500 Lesevorgänge pro Sekunde sind trivial - sogar 500,00 sind in der Regel trivial. Und der BackgroundWorker-Typ wurde speziell für die Interaktion mit Desktop-Apps entwickelt, z. B. für die Übergabe von Ergebnissen an die Benutzeroberfläche, ohne sich um Thread-Interaktionen kümmern zu müssen.

Verarbeitung der Berechnungen

Dann müssen Sie die „komplexe“ Berechnungen verarbeiten. Dies hängt davon ab, wie langlebig diese Berechnungen sind. Wenn wir davon ausgehen, dass sie kurzlebig sind (sagen wir weniger als 1 Sekunde), dann denke ich, dass die Verwendung des TaskScheduler und des Standards ThreadPool in Ordnung sein wird.Sie erstellen also für jede Berechnung eine Task, und dann den TaskScheduler kümmern sich um die Zuweisung von Aufgaben zu Threads.

Die Aufgabe des TaskSchedulers besteht darin, die Arbeit durch Last-Balance-Aufgaben zu staffeln und den ThreadPool so zu verwalten, dass Workload und Anzahl der Prozessorkerne auf dem Computer am besten ausgeglichen werden. Sie können sogar override the default TaskScheduler Aufgaben auf die von Ihnen gewünschte Weise planen.

Der ThreadPool ist eine FIFO-Warteschlange von Arbeitselementen, die verarbeitet werden müssen. In .NET 4.0 hat der ThreadPool die Leistung verbessert, indem die Arbeitswarteschlange eine Thread-sichere ConcurrentQueue Sammlung erstellt.

Aufgabe Messdurchsatz und Effizienz

können Sie PerformanceCounter verwenden sowohl CPU and memory usage zu messen. Dadurch erhalten Sie eine gute Vorstellung davon, ob die Kerne und der Speicher effizient genutzt werden. Der Task-Durchsatz wird einfach gemessen, indem die Rate betrachtet wird, mit der Aufgaben verarbeitet werden und Ergebnisse geliefert werden.

Bitte beachte, dass ich keinen Code hier nicht enthalten sind, wie ich annehmen, dass Sie mit den Implementierungsdetails für Ihren Professor :-)

+0

Hallo, danke für deine Hilfe. es ist ein proof of concept ich kann wählen was ich will. so C# .net 4 winforms ist das Ding, ich arbeite jetzt mit .... –

+0

ich denke, ich habe es nicht richtig erklärt ........ die Menge an liest pro Sekunde ist nicht wichtig, die wichtige Sache ist, dass jeder Sensor wird mindestens einmal pro Sekunde gelesen. also einmal pro Sekunde ist ok .... vielleicht besser, bevor Sie das System mit Aufgaben töten –

+0

Das Lesen aller Sensoren und Aktualisieren der UI kann in einem einzigen Thread erfolgen - mit Hilfe des Backgroundworker in diesem Beispiel. Es ist nur die "komplexe" Verarbeitung, die auf parallele Weise (Multi-Threading) durchgeführt werden muss. – RoadWarrior

Verwandte Themen