RSS

Uruchamianie małych zadań w tle

Liczba odsłon: 14

Przy okazji omawiania sposobów jak najszybszego otwierania okna dialogowego wspominałem, że długotrwałe operacje dobrze jest zlecić do wykonania w tle, by były realizowane już podczas tworzenia okna dialogowego i przygotowywania go do pracy. Należy jednak pamiętać, że operacja tworzenia nowego wątku również trwa określony czas. W efekcie czas realizowania niezbyt długotrwałej operacji w tle może się znacząco wydłużyć i cały mechanizm – zamiast poprawić responsywność programu — pogorszy ją.

Rozwiązaniem są zbiory wątków (ang. thread pools). Zbiór wątków uruchamia określoną liczbę wątków podczas uruchamiania programu (ich ilość powinna zależeć od liczby rdzeni procesorów oraz od wymagań programu), a następnie usypia je wszystkie, czekając na zlecenia. Program może w dowolnym momencie dodać zlecenie do listy oczekujących na wykonanie, powodując wybudzenie jednego z wątków i podjęcie zleconej pracy. W porównaniu do czasu tworzenia nowego wątku, czas budzenia jest pomijalnie mały: zadanie skierowane do realizacji w tle rozpoczynane jest praktycznie natychmiast. W zależności od charakteru programu i jego chwilowych wymagań, liczba wątków w zbiorze może dynamicznie ulegać ograniczeniu (by oszczędzać zasoby systemu operacyjnego) lub zwiększeniu (by przetwarzać więcej danych równolegle).

Zastosowanie zbiorów wątków jest też dobrym sposobem na zwiększenie skalowalności programu. Wystarczy podzielić jakieś zadanie na kilka niezależnych od siebie części i skierować je do wykonania w ramach zbioru wątków. Na komputerze jednoprocesorowym wszystkie zadania zostaną wykonane sekwencyjnie, czyli bez zmian w stosunku do klasycznego sposobu programowania. Zastosowanie procesora wielordzeniowego (lub komputera wieloprocesorowego) pozwoli automatycznie rozdzielić zadania między rdzenie procesorów, bez dodatkowego nakładu pracy przyspieszając realizację całej ich sekwencji.

Zbiory wątków jako technika programowania tak zyskują na znaczeniu, że odpowiednie interfejsy API ułatwiające korzystanie z nich są wbudowywane w osnowy programistyczne i systemy operacyjne. API obsługujące wysokosprawne zbiory wątków zostało dołączone do systemu Windows od wersji 2000 i doczekało się znaczącej rozbudowy w Windows Vista. Z kolei osnowa .NET Framework praktycznie od początku zawiera odpowiednie (i niezależne od systemu operacyjnego) klasy, sprowadzające realizację zadania w tle do stworzenia instancji standardowej klasy obiektu ze wskazaniem procedury, która powinna zostać wykonana w odrębnym wątku.