2015-12-25 12 views
5

Mam interesujące ćwiczenie do rozwiązania od mojego profesora. Ale potrzebuję odrobiny pomocy, żeby nie nudzić się podczas wakacji.Jak rozpocząć tworzenie wielowątkowego systemu równoważenia obciążenia?

ćwiczenia jest

  • tworzyć wielowątkowe równoważenia obciążenia, który czyta 1 punkt pomiarowy z 5 czujników w każdej sekundzie. (dlatego 5 wartości na sekundę).
  • Następnie wykonaj kilka "złożonych" obliczeń z tymi wartościami.
  • Drukowanie wyników obliczeń na ekranie. (jak maksymalna wartość lub średnia wartość czujnika 1-5 itd., oczywiście wielowątkowe)
  • Jako dodatkowe zadanie muszę się również upewnić, że jeśli w przyszłości na przykład odczytywanych będzie 500 czujników co sekundę, komputer nie robi tego ". t opuścić zadanie. (równoważenie obciążenia).

Mam plik tekstowy CSV z ~ 400 punktami pomiarowymi z 5 wyimaginowanych czujników.

Co myślę, że mam do zrobienia:

  1. Czytaj punkty pomiarowe do tablicy
  2. Zapewnienie wątku bezpieczny dostęp do tej tablicy
  3. tarło nowy wątek dla każdej wartości, który oblicza trochę matematyki rzeczy
  4. ustawiona wartość mAX dla maksymalnych jednoczesnych wątków roboczych

Jestem nowy wielowątkowość aplikacyjne ns w C# ale myślę, że używanie threadpool jest właściwą drogą. Obecnie pracuję nad kolejką i może uruchamiam ją wewnątrz zadania, więc nie będzie blokować aplikacji.

Co byś polecił?

+0

Czy zamierzasz obliczyć średnie wartości Max, niezależnie dla każdego czujnika? – alexm

+0

tak, to jest "projekt". powinien jakoś skalować się ze wzrostem czujników, ale nie powinien zabijać procesora .... –

+0

lub co ważniejsze: nie powinien zabijać aplikacji i jej funkcji. –

Odpowiedz

3

Istnieje kilka środowisku Zależności tutaj:

  • Jaka wersja .NET używasz?
  • Z jakiego interfejsu użytkownika korzystasz - desktop (WPF/WinForms) lub ASP.NET?

Załóżmy, że to .NET 4.0 lub nowszy i aplikacja komputerowa.

Odczyt czujników

w aplikacji WPF lub WinForms, użyłbym jednego BackgroundWorker do odczytu danych z czujników. 500 odczytów na sekundę jest banalne - nawet 500,00 jest zwykle banalne. Typ BackgroundWorker został specjalnie zaprojektowany do interakcji z aplikacjami komputerowymi, na przykład przekazywanie wyników do interfejsu użytkownika bez martwienia się o interakcje między wątkami.

tworzenie obliczeń

Następnie trzeba przetwarzać „kompleks” obliczeń. To zależy od tego, jak długo trwają te obliczenia. Jeśli założymy, że są krótkotrwałe (powiedzmy mniej niż po 1 sekundzie), wtedy myślę, że używanie TaskScheduler i standardu ThreadPool będzie w porządku.Zatem dla każdego obliczenia należy utworzyć Task, a następnie pozwolić TaskSchedulerowi zająć się przydzielaniem zadań wątkom.

Zadaniem TaskScheduler jest równoważenie obciążenia pracy poprzez kolejkowanie lekkich zadań do cięższych wątków i zarządzanie wątkiem, aby zrównoważyć obciążenie pracą i liczbę rdzeni na komputerze. Możesz nawet override the default TaskScheduler zaplanować zadania w dowolny sposób.

Wątek wątków jest kolejką elementów roboczych FIFO, które należy przetworzyć. W programie .NET 4.0 element ThreadPool poprawił wydajność, sprawiając, że kolejka pracy stanowi kolekcję wątków ConcurrentQueue.

pomiaru przepustowości zadań i efektywności

Można użyć PerformanceCounter do pomiaru zarówno CPU and memory usage. Daje to dobre pojęcie o tym, czy rdzenie i pamięć są wykorzystywane efektywnie. Przepustowość zadania mierzy się po prostu miarą szybkości przetwarzania zadań i dostarczania wyników.

Zauważ, że nie mam żadnego kodu zawarte tutaj, bo zakładam, że chcą zajmować się szczegółami implementacji dla swojego profesora :-)

+0

cześć, dziękuję za pomoc. to dowód na to, że mogę wybrać, co chcę. więc C# .net 4 winforms to rzecz, nad którą pracuję teraz z ... –

+0

Myślę, że nie wyjaśniłem tego dobrze ........ ilość odczytów na sekundę nie jest ważna, ważne jest to, że każdy czujnik będzie odczytywany co najmniej raz na sekundę. więc raz na sekundę jest ok .... może lepiej przed zabiciem systemu z zadaniami –

+0

Odczytywanie wszystkich czujników i aktualizowanie interfejsu użytkownika można wykonać na jednym wątku - za pomocą narzędzia Backgroundworker w tym przykładzie. To tylko "złożone" przetwarzanie, które musi być wykonane w sposób równoległy (wielowątkowy). – RoadWarrior

Powiązane problemy