Pula wątków to grupa wstępnie utworzonych, nieaktywnych wątków, które są gotowe do wykonania pracy. Są one lepsze niż tworzenie nowych wątków dla każdego zadania, gdy do wykonania jest duża liczba krótkich zadań, a nie niewielka liczba długich. Zapobiega to ponoszeniu nakładów związanych z tworzeniem wątku wiele razy.
Wdrożenie będzie się różnić w zależności od środowiska, ale w uproszczeniu potrzebujesz:
- Sposób tworzenia wątków i utrzymywania ich w stanie bezczynności. Można to osiągnąć, każąc każdemu wątkowi poczekać na barierę, aż basen poda jej działanie. (Można to również zrobić z muteksami.)
- Kontener do przechowywania utworzonych wątków, takich jak kolejka lub inna struktura, która ma sposób na dodanie wątku do puli i wyciągnięcie go.
- Standardowy interfejs lub klasa abstrakcyjna dla wątków używanych podczas wykonywania pracy. Może to być klasa abstrakcyjna wywoływana
Task
za pomocą execute()
metody, która wykonuje pracę, a następnie zwraca.
Po utworzeniu puli wątków zostanie utworzona instancja określonej liczby wątków, aby ją udostępnić, lub utworzone nowe, zależnie od potrzeb implementacji.
Kiedy pula zostanie podana a Task
, pobiera nić z pojemnika (lub czeka, aż stanie się dostępna, jeśli pojemnik jest pusty), wręcza a Task
i napotyka barierę. Powoduje to, że wątek bezczynny wznawia wykonywanie, wywołując podaną execute()
metodę Task
. Po zakończeniu wykonywania nić oddaje się z powrotem do puli, która ma zostać umieszczona w pojemniku w celu ponownego użycia, a następnie napotyka barierę, kładąc się spać, aż cykl się powtórzy.
Pula wątków to zbiór zarządzanych wątków zwykle zorganizowanych w kolejce, które wykonują zadania w kolejce zadań.
Tworzenie nowego obiektu wątku za każdym razem, gdy potrzebujesz wykonać coś asynchronicznie, jest kosztowne. W puli wątków wystarczy dodać zadania, które mają zostać wykonane asynchronicznie, do kolejki zadań, a pula wątków zajmuje się przypisaniem dostępnego wątku, jeśli taki istnieje, do odpowiedniego zadania. Jak tylko zadanie zostanie zakończone, dostępny wątek zażąda innego zadania (zakładając, że zostało jakieś).
Pula wątków pomaga uniknąć tworzenia lub niszczenia większej liczby wątków, niż byłoby to naprawdę konieczne.
Zacznę od stworzenia klasy z kolejką wątków i kolejką zadań. Następnie zaimplementuj metodę, która dodaje zadanie do kolejki zadań i przejdź od tego miejsca. Oczywiście należy również umożliwić ustawienie maksymalnej dozwolonej liczby wątków w puli wątków.
źródło
W aplikacji wielowątkowej pula wątków to „pula dostępnych wątków”, z których może korzystać aplikacja. Zazwyczaj, np. .NET, wszystko jest zarządzane, więc po prostu przypisuj zadania, a gdy wątek będzie wolny, wykona go. Aby wdrożyć pulę wątków, spodziewałbym się stworzyć koncepcję, w której zadania są automatycznie podejmowane przez wolne wątki bez jawnego tworzenia wątków dla każdego zadania.
źródło
Przykład z życia;
Masz placówkę, w której pracuje 12 osób. Istnieją 3 sekcje tego obiektu. Kuchnia, toalety i bezpieczeństwo. Jeśli nie użyjesz techniki puli wątków, tak to działa: wszystkie 12 osób będzie stać w pokoju konferencyjnym, jeśli nowi klienci przyjdą według placówki i poproszą o zadania, to rozdzielisz osoby w grupach i wyślesz je do pracy i wróć do pokoju konferencyjnego. Ale zanim przejdą do służby, następuje faza przygotowawcza. Muszą nosić odpowiedni mundur, wyposażyć niektóre urządzenia i przejść do tej sekcji, dokończyć pracę i wrócić. Dlatego za każdym razem, gdy kończą pracę (kończą się nici), muszą wracać do pokoju konferencyjnego, rozbierać mundur, wyjmować sprzęt i czekać na następną pracę. Odnoszą się one do tworzenia kontekstu wątku, jego alokacji pamięci i informacji śledzenia przez system operacyjny.
Jeśli używasz łączenia wątków, wczesnym rankiem przypiszesz 6 osób do kuchni, 2 osoby do toalety i 4 osoby do ochrony. Więc będą przygotowywać się tylko raz dziennie. Nawet jeśli w kuchni nie ma klientów, te 4 osoby będą na biegu jałowym, czekając na nadchodzące zadania. Nie muszą wracać do pokoju konferencyjnego, dopóki kuchnia się nie zamknie (aplikacja się kończy). Te 4 osoby znajdują się w puli aplikacji Kuchnia i są gotowe do szybkiego podania. Ale nie możesz obiecać, że pracują cały dzień, ponieważ kuchnia może od czasu do czasu stać się bezczynna. Ta sama logika dotyczy również toalet i bezpieczeństwa.
W pierwszym scenariuszu nie marnujesz żadnego wątku na żadne zadanie, ALE przygotowanie każdego wątku na każde zadanie zajmie dużo czasu. Po drugie, przygotowujesz wątki z wyprzedzeniem, więc nie możesz zagwarantować, że będziesz używać wszystkich wątków do wszystkich zadań, ale system operacyjny głównie dokonuje na nim wielkiej optymalizacji, więc możesz na nim bezpiecznie polegać.
źródło