При использовании Task что происходит, если ThreadPool заполнен / занят? - PullRequest
7 голосов
/ 13 марта 2012

Когда я использую класс задачи .Net 4, который использует ThreadPool, что произойдет, если все потоки заняты?

Создает ли TaskScheduler новый поток и расширяет ли максимальное число потоков ThreadPool или он сидит и ждет, пока поток не станет доступным?

Ответы [ 3 ]

8 голосов
/ 13 марта 2012

Максимальное количество потоков в ThreadPool равно примерно 1000 потоков в 32-разрядной системе .NET4.0.Это меньше для старых версий .NET.Если у вас запущено 1000 потоков, скажем, по какой-то причине они блокируют, когда вы ставите в очередь 1001-ю задачу, она никогда не будет выполнена.

Вы никогда не достигнете максимального числа потоков в 32-битном процессе.Имейте в виду, что каждый поток занимает не менее 1 МБ памяти (это размер стека пользовательского режима), а также любые другие издержки.Вы уже теряете много памяти из CLR и загруженных собственных DLL, поэтому перед использованием такого количества потоков вы получите исключение OutOfMemoryException.

Вы можете изменить количество потоков, которые может использовать ThreadPool, вызвавThreadPool.SetMaxThreads метод.Однако, если вы планируете использовать такое количество потоков, у вас проблема с кодом на намного больше.Я НЕ рекомендую возиться с подобными конфигурациями ThreadPool.Скорее всего, у вас просто ухудшится производительность.

Имейте в виду, что Task и ThreadPool.QueueUserWorkItem, потоки повторно используются после завершения.Если вы создаете задачу или ставите в очередь поток пула потоков, он может или может не создавать новый поток для выполнения вашего кода.Если в пуле уже есть доступные потоки, он будет использовать один из них вместо создания (дорогого) нового потока.Только если методы, которые вы выполняете в задачах, никогда не вернутся, вам следует беспокоиться о нехватке потоков, но, как я уже сказал, это совсем другая проблема с вашим кодом.

7 голосов
/ 13 марта 2012

По умолчанию MaxThreads ThreadPool очень высокий. Обычно вы никогда не попадете туда, сначала произойдет сбой вашего приложения.

Таким образом, когда все потоки заняты, новые задачи ставятся в очередь и медленно, не более 1 на 500 мс, TP выделяет новые потоки.

5 голосов
/ 13 марта 2012

Это не увеличит MaxThreads.Когда задач больше, чем доступных рабочих потоков, некоторые задачи будут поставлены в очередь и ждут, пока пул потоков предоставит доступный поток.Он делает довольно сложные вещи для масштабирования с большим количеством ядер (кража работы, внедрение потоков и т. Д.).

...