GoDev

Blog programisty.

Programowanie Reaktywne - Kto za tym stoi? - Scheduler.


Artykuł ten jest częścią serii artykułów na temat Programowania reaktywnego.

Zapraszam na GitHub-a.

Tematy

  1. Wstęp
  2. Zabawa z czasem - Timer
  3. Kto za tym stoi? - Scheduler
  4. Nie zapominaj - Subscribe
  5. Zabawa z czasem - Interval
  6. Zabawa z czasem - Buffer
  7. Zabawa z czasem - Delay
  8. Zabawa z czasem - Sample
  9. Zabawa z czasem - Throttle
  10. Zabawa z czasem - Timestamp/TimeInterval
  11. Tworzymy dane - Generators
  12. Tworzymy dane - Własna klasa publikująca
  13. Marudzimy - Skip
  14. Marudzimy - Take
  15. Łap To! - ConsoleKey
  16. Kombinatorzy - Concat
  17. Kombinatorzy - Repeat
  18. Kombinatorzy - Start With
  19. Kombinatorzy - Ambiguous
  20. Kombinatorzy - Merge
  21. Kombinatorzy - Zip
  22. Kombinatorzy - Switch
  23. Kombinatorzy - When-And-Then
  24. Kombinatorzy - Combine Latest
  25. Transformers - Select
  26. Transformers - OfType and Cast
  27. Transformers - Metadata
  28. Bileciki do kontroli - Unit Tests of Interval
  29. Bileciki do kontroli - Unit Tests of Observer Interval
  30. Bileciki do kontroli - Unit Tests of Create Cold/Hot Observable
  31. Szpryca - AutoFac

Wstęp

Reactive Extensions - Scheduler A jak funkcjonują ten cały mechanizm obserwowanego i obserwatora? Przecież muszą być obrabiane w pocie czoła przez nasze wspaniałe CPU… Magia dzieje się poza naszym polem widzenia.

Biblioteka Rx udostępnia mechanizm harmonogramu. Odpowiedzialny jest za rozsyłanie powiadomień do subskrybentów.

Schedulery

Do dyspozycji mamy dość sporą grupę scheduler-ów, skupię się na kilku głównych.

W tym celu napisałem klasę pomocniczą opartą na poznanym już terminie Timerów o nazwie ExampleTimer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public ExampleTimer(String name, IScheduler scheduler)
{
  Initialize(name);
  _timerObservable = Observable.Timer(_dueTime, _period, scheduler);

  Subscribe();
}

private void Initialize(String name)
{
  _dueTime = TimeSpan.FromSeconds(1);
  _period = TimeSpan.FromSeconds(1);
  _name = name;
}

ImmediateScheduler - bazując na tym zostanie uruchomiony natychmiast na bierz, działa na bieżącym wątku, synchronicznie.

1
new ExampleTimer("ImmediateScheduler", ImmediateScheduler.Instance)

CurrentThreadScheduler - bazuje na bieżącym wątku, i jest normalnie kolejkowań jak każda inna operacja. Tym samym może przylagować, podobnie jak Immediate działa synchronicznie.

1
new ExampleTimer("CurrentThreadScheduler", CurrentThreadScheduler.Instance)

NewThreadScheduler - działa na nowym niezależnym wątku, dobrze nadaje się do długich działań, działa asynchronicznie.

1
new ExampleTimer("NewThreadScheduler", NewThreadScheduler.Default)

ThreadPoolScheduler - publikowanie treści pochodzi z puli wątków działających w tle, przeznaczone do krótkotrwałego używania, asynchronicznie.

1
new ExampleTimer("ThreadPoolScheduler", ThreadPoolScheduler.Instance)

Reactive Extensions - Scheduler TaskPoolScheduler - akcje wyzwalane są w tym przypadku z puli zadań jest to forma bardzie abstrakcyjna aniżeli pula wątków. Najlepiej wykorzystać w krótkich działaniach jest to też działanie asynchronicznie.

1
new ExampleTimer("TaskPoolScheduler", TaskPoolScheduler.Default)

Jeżeli nie zdefiniujemy żadnego schedulera, to wówczas zostanie przydzielony automatycznie na podstawie kontekstu tworzenia obiektu obserwowanego.

Zakończenie

Przeważnie nie ma potrzeby manipulowaniem automatycznego przydzielania Schedulera. Jednak w pewnych sytuacjach można wpłynąć na to jak będzie się zachowywał.

To na tyle w tym pościku, zapraszam do kolejnych.


Jest to post wchodzący w skład podjętego wyzwania ogłoszonego przez MIROBURN we vlogu z dnia 3 lutego 2018 roku.

Celem wyzwania jest systematyczne działanie w ciągu 30 dni.

Postanowiłem pisać post dziennie o tematyce Programowania Reaktywnego dla platformy .NET.

Wszelkie źródła związane z postami znajdują się na repozytorium GitHub.

Stan obecny wyzwania: 30 z 30 dni.


Referencje:


Wcześniejszy: Programowanie Reaktywne - Zabawa z czasem - Timer.

Następny: Programowanie Reaktywne - Nie zapominaj - Subscribe.