В этот веб-учебник по потоковому использованию на С#, Джозеф Альбахари пишет: "Не ходите спать в пул-потоках!" Почему вы не должны этого делать? Как сильно это может повлиять на производительность? (Это не то, что я хочу это сделать, мне просто интересно.)
Сон в объединенной нитке С#
Ответ 1
Тема представляет собой тяжеловесный объект.
Создание нового потока требует большого количества ресурсов, таких как назначение 1 МБ для управляемого стека, создание объекта управляемого потока, стек ядра, объект потока ядра, блок среды пользовательских потоков. Для этого требуется время и память. Поэтому вы не хотите быстро создавать и уничтожать объекты. Кроме того, после того, как вы переключитесь на несколько потоков, вы также возьмете некоторые ресурсы
Пул потоков - это место, где CLR может помещать неиспользуемые потоки, в случае, если ваше приложение нуждается в нем.
Threadpool изначально содержит 0 потоков, как только вы запрашиваете поток из пула, пул быстро создаст минимальное количество потоков, определенных для пула. Примерно через 2 минуты погибают неиспользуемые нити. Но если нагрузка увеличивается, и вам нужно больше потоков, пул потоков будет медленно создавать новые потоки, пока не будет достигнута максимальная граница. У вас не может быть больше потоков, чем максимум, все новые запросы будут поставлены в очередь и выполняться после того, как рабочий поток вернется в пул. В худшем случае вы можете получить OutOfMemoryException
Если поток, взятый из пула, заблокирован, он:
- Удерживает ресурсы
- Не делает никакой ценной работы, в то время как для приложения может понадобиться этот поток для нового запроса
- Прерывает масштабируемость, введя блоки
Ответ 2
В пуле потоков имеется ограниченное количество потоков; пулы потоков предназначены для эффективного выполнения большого количества коротких задач. Они полагаются на выполнение каждой задачи быстро, так что поток может вернуться в пул и использоваться для следующей задачи.
Таким образом, спать в потоке пула потоков пустит пул, который может в конечном итоге закончиться доступными потоками и не сможет обработать задачи, которые вы ему назначили.
Ответ 3
Пул потоков предназначен для быстрого выполнения относительно короткой задачи в другом потоке без необходимости тратить затраты на создание нового потока. Пул потоков имеет максимальное количество потоков, и как только это будет достигнуто, задачи будут поставлены в очередь до тех пор, пока поток не станет доступен.
Таким образом, поток, спящий в пуле потоков, будет удерживать очередь или вносить вклад в истощение пула потоков.