Wątek a pula wątków

137

Jaka jest różnica między używaniem nowego wątku a użyciem wątku z puli wątków? Jakie są korzyści z wydajności i dlaczego powinienem rozważyć użycie wątku z puli, a nie tego, który jawnie utworzyłem? Myślę tutaj szczególnie o .NET, ale ogólne przykłady są w porządku.

Mark Ingram
źródło

Odpowiedzi:

110

Pula wątków zapewni korzyści w przypadku częstych i stosunkowo krótkich operacji według

  • Ponowne wykorzystanie już utworzonych wątków zamiast tworzenia nowych (kosztowny proces)
  • Ograniczanie szybkości tworzenia wątków, gdy występuje seria żądań nowych elementów pracy (uważam, że jest to tylko w .NET 3.5)

    • Jeśli ustawisz w kolejce 100 zadań puli wątków, użyje on tylko tylu wątków, ile zostało już utworzonych do obsługi tych żądań (na przykład 10). Pula wątków będzie często sprawdzać (uważam, że co 500 ms w 3.5 SP1), a jeśli są zadania w kolejce, utworzy jeden nowy wątek. Jeśli twoje zadania są szybkie, liczba nowych wątków będzie niewielka, a ponowne użycie około 10 wątków do krótkich zadań będzie szybsze niż utworzenie 100 wątków z góry.

    • Jeśli obciążenie stale napływa do dużej liczby żądań puli wątków, pula wątków dostosuje się do obciążenia, tworząc więcej wątków w puli za pomocą powyższego procesu, aby dostępna była większa liczba wątków do przetwarzania żądań

    • sprawdź Tutaj, aby uzyskać więcej szczegółowych informacji na temat działania puli wątków pod maską

Samodzielne utworzenie nowego wątku byłoby bardziej odpowiednie, gdyby praca miała trwać stosunkowo długo (prawdopodobnie około sekundy lub dwóch, ale zależy to od konkretnej sytuacji)

@Krzysztof - Wątki puli wątków to wątki w tle, które zatrzymają się po zakończeniu głównego wątku. Wątki utworzone ręcznie są domyślnie na pierwszym planie (będą działać po zakończeniu wątku głównego), ale można je ustawić w tle przed wywołaniem na nich Start.

Karg
źródło
5
Jedyne, nad czym się zastanawiam, to poniższa instrukcja z MSDN ( msdn.microsoft.com/en-us/library/1c9txz50.aspx ) „Wątek w tle jest wykonywany tylko wtedy, gdy liczba wykonywanych wątków pierwszego planu jest mniejsza niż liczba procesorów . ”. Czy to oznacza, że ​​podczas dzielenia pracy na rdzenie pierwszeństwo mają wątki pierwszego planu?
cdiggins
1
➤ Nie można przerwać ani przerwać wątku z puli wątków. ➤ Nie możesz dołączyć do wątku z puli wątków. Aby to osiągnąć, musisz użyć innych mechanizmów
Zinov
14

Pula wątków zarządzana przez .NET: -

  • Rozmiary się na podstawie bieżącego obciążenia i dostępnego sprzętu
  • Zawiera wątki robocze i wątki portu zakończenia (które są specjalnie używane do obsługi operacji we / wy)
  • Jest zoptymalizowany pod kątem dużej liczby stosunkowo krótkotrwałych operacji

Istnieją inne implementacje puli wątków, które mogą być bardziej odpowiednie dla długotrwałych operacji.

W szczególności użyj puli wątków, aby zapobiec tworzeniu przez aplikację zbyt wielu wątków. Najważniejszą cechą puli wątków jest kolejka robocza. Oznacza to, że gdy twój komputer jest wystarczająco zajęty, pula wątków będzie ustawiać żądania w kolejce, zamiast natychmiast tworzyć więcej wątków.

Jeśli więc utworzysz małą, ograniczoną liczbę wątków, utwórz je samodzielnie. Jeśli nie możesz z góry określić, ile wątków może zostać utworzonych (np. Są one tworzone w odpowiedzi na przychodzące operacje we / wy), a ich praca będzie krótkotrwała, użyj puli wątków. Jeśli nie wiesz, ile, ale ich praca będzie długotrwała, na platformie nie ma nic, co by ci pomogło - ale możesz znaleźć alternatywne implementacje wątków, które pasują.

Jaskółka oknówka
źródło
Czy w .NET można używać portów zakończenia bez puli wątków? Przyjąłem założenie, że asynchroniczne metody I / O są jedynym sposobem (w .NET) i że używają puli wątków
Karg
10

również

new Thread().Start()

spawnuje wątek pierwszego planu, który nie zginie, jeśli zamkniesz program. Wątki ThreadPool to wątki w tle, które umierają po zamknięciu aplikacji.


źródło
11
Zawsze możesz ustawić wątek w tle. Domyślnie są tylko na pierwszym planie.
Kris Erickson,
3
nemo: var t = nowy wątek (...); t.BackgroundThread = true; t.Start ();
Ricardo Amores
18
Wyjaśnienie dotyczące terminu „program”. Aplikacja klasyczna działa w procesie i ma co najmniej jeden wątek pierwszego planu, który zarządza interfejsem użytkownika. Ten proces będzie działał tak długo, jak długo będzie zawierał wątki pierwszego planu. Po zamknięciu aplikacji klasycznej wątek interfejsu użytkownika pierwszego planu zatrzymuje się, ale niekoniecznie zatrzymujesz proces, jeśli ma inne wątki pierwszego planu.
G-Wiz
8

Byłem zaciekawiony względnym zużyciem zasobów i przeprowadziłem test porównawczy na moim dwurdzeniowym laptopie Intel i5 z 2012 r., Używając kompilacji .net 4.0 w systemie Windows 8. Pule wątków zajmowały średnio 0,035 ms, podczas gdy wątki zajmowały średnio 5,06 SM. Innymi słowy Wątek w puli rozpoczął się około 300 razy szybciej w przypadku dużej liczby wątków o krótkim czasie życia. Przynajmniej w testowanym zakresie (100-2000) wątków całkowity czas na wątek wydawał się dość stały.

Oto kod, który został przetestowany:

    for (int i = 0; i < ThreadCount; i++) {
        Task.Run(() => { });
    }

    for (int i = 0; i < ThreadCount; i++) {
        var t = new Thread(() => { });
        t.Start();
    }

wprowadź opis obrazu tutaj

PeterM
źródło
5
Myślę, że to dlatego, że ThreadPool ponownie wykorzystuje utworzone wątki zamiast tworzyć nowe (co jest bardzo drogie)
fabriciorissetto
1

Lokalny magazyn wątków nie jest dobrym pomysłem w przypadku pul wątków. Daje wątkom „tożsamość”; nie wszystkie wątki są już równe. Teraz pule wątków są szczególnie przydatne, jeśli potrzebujesz tylko kilku identycznych wątków, gotowych do pracy bez narzutu tworzenia.

MSalters
źródło
1

Jeśli potrzebujesz wielu wątków, prawdopodobnie chcesz użyć puli wątków. Ponownie wykorzystują wątki, oszczędzając narzut tworzenia wątków.

Jeśli potrzebujesz tylko jednego wątku, aby coś zrobić, wątek jest prawdopodobnie najłatwiejszy.

Rob Prouse
źródło
1

Podstawową potrzebą wątków theadpool jest obsługa krótkich, małych zadań, które powinny zakończyć się niemal natychmiast. Programy obsługi przerwań sprzętowych często działają w kontekście stosowym, który nie byłby odpowiedni dla kodu innego niż jądro, ale program obsługi przerwań sprzętowych może wykryć, że wywołanie zwrotne zakończenia operacji we / wy w trybie użytkownika powinno zostać uruchomione tak szybko, jak to możliwe. Stworzenie nowego wątku w celu uruchomienia czegoś takiego byłoby ogromną przesadą. Posiadanie kilku wstępnie utworzonych wątków, które można wysłać w celu uruchomienia wywołań zwrotnych zakończenia we / wy lub innych podobnych rzeczy, jest znacznie bardziej wydajne.

Kluczowym aspektem takich wątków jest to, że jeśli metody uzupełniania we / wy zawsze kończą się zasadniczo natychmiastowo i nigdy nie blokują, a liczba takich wątków, które obecnie korzystają z takich metod, jest co najmniej równa liczbie procesorów, jedyny sposób, w jaki każdy inny wątek mogłaby zostać uruchomiona przed zakończeniem jednej z wyżej wymienionych metod, gdyby jedna z pozostałych metod była blokowana lub jej czas wykonania przekroczył normalny przedział czasu wątkowania; żadne z tych nie powinno zdarzać się bardzo często, jeśli pula wątków jest używana zgodnie z przeznaczeniem.

Jeśli nie można oczekiwać, że metoda zakończy działanie w ciągu 100 ms od rozpoczęcia wykonywania, metoda powinna zostać wykonana za pomocą innych środków niż główna pula wątków. Jeśli masz wiele zadań do wykonania, które wymagają dużej mocy obliczeniowej, ale nie będą blokowane, pomocne może być wysłanie ich za pomocą puli wątków aplikacji (po jednym na rdzeń procesora), która jest oddzielna od „głównej” puli wątków, ponieważ użycie więcej wątków niż rdzeni przyniesie efekty odwrotne do zamierzonych podczas wykonywania nieblokujących zadań intensywnie wykorzystujących procesor. Jeśli jednak wykonanie metody zajmie sekundę lub dłużej i większość czasu będzie blokowana, metoda powinna prawdopodobnie zostać uruchomiona w dedykowanym wątku i prawie na pewno nie powinna być uruchamiana w wątku głównego wątku. Jeśli długotrwała operacja musi zostać wyzwolona przez coś takiego jak wywołanie zwrotne we / wy,

superkat
źródło
0

Ogólnie (nigdy nie korzystałem z platformy .NET), pula wątków byłaby używana do celów zarządzania zasobami. Umożliwia skonfigurowanie ograniczeń w oprogramowaniu. Można to również zrobić ze względu na wydajność, ponieważ tworzenie nowych wątków może być kosztowne.

Mogą również istnieć przyczyny specyficzne dla systemu. W Javie (znowu nie wiem, czy dotyczy to .NET), menedżer wątków może stosować zmienne specyficzne dla wątku, gdy każdy wątek jest wyciągany z puli i wyłączać je, gdy są zwracane (powszechny sposób przekazywania czegoś takiego jak tożsamość).

Przykładowe ograniczenie: Mam tylko 10 połączeń db, więc zezwoliłbym tylko 10 wątkom roboczym na dostęp do bazy danych.

Nie oznacza to, że nie powinieneś tworzyć własnych wątków, ale istnieją warunki, w których użycie puli ma sens.

Rudzik
źródło
0

Korzystanie z puli jest dobrym pomysłem, jeśli nie wiesz lub nie możesz kontrolować, ile wątków zostanie utworzonych.

Po prostu mam problem z formularzem używającym wątku do aktualizacji jakiegoś pola z bazy danych w zdarzeniu zmiany pozycji kontrolki listy (unikaj zamarzania). Minęło 5 minut, zanim mój użytkownik miał błąd w bazie danych (zbyt wiele połączeń z Access), ponieważ zmieniał pozycję listy zbyt szybko ...

Wiem, że istnieje inny sposób rozwiązania problemu podstawowego (w tym nieużywania dostępu), ale tworzenie puli to dobry początek.

Marco Guignard
źródło
0

Wątek :

  1. Tworzenie wątku jest znacznie wolniejsze niż korzystanie z puli wątków.
  2. Możesz zmienić priorytet wątku.
  3. Maksymalna liczba wątków w procesie związanym z zasobami.
  4. Wątek jest na poziomie systemu operacyjnego i kontrolowany przez system operacyjny.
  5. Korzystanie z wątku jest lepszą opcją, gdy zadanie jest stosunkowo długotrwałe

Pula wątków :

  1. Uruchamianie wątku w puli wątków jest znacznie szybsze niż bezpośrednie tworzenie wątku.
  2. Nie można zmienić priorytetu uruchomienia wątku na podstawie puli wątków.
  3. Istnieje tylko jedna pula wątków na proces.
  4. Pula wątków jest zarządzana przez środowisko CLR.
  5. Pula wątków jest przydatna w przypadku operacji krótkotrwałych.
  6. Liczba wątków w puli wątków jest związana z obciążeniem aplikacji.
  7. Zadania TPL są uruchamiane w oparciu o pulę wątków
Seyedraouf Modarresi
źródło