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.
źródło
Pula wątków zarządzana przez .NET: -
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ą.
źródło
również
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
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:
źródło
Sprawdź tutaj wcześniejszy wątek:
Kiedy nie należy używać puli wątków w .Net?
Podsumowując, Threadpool jest dobry, jeśli potrzebujesz spawnować wiele krótkotrwałych wątków, podczas gdy korzystanie z Threads zapewnia nieco większą kontrolę.
źródło
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.
źródło
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.
źródło
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,
źródło
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.
źródło
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.
źródło
Wątek :
Pula wątków :
źródło