Сколько потоков создаст Parallel.For(Foreach)? По умолчанию MaxDegreeOfParallelism?
Я хочу знать, сколько потоков будет использовано при запуске цикла Parallel.For/ForEach.
Я обнаружил, что его можно изменить с помощью опции MaxDegreeOfParallelism.
Справка MaxDegreeOfParallelism в MSDN говорит (ссылка):
По умолчанию For и ForEach будут использовать, однако, много потоков, базовый планировщик обеспечивает, поэтому изменение MaxDegreeOfParallelism от значение по умолчанию ограничивает количество одновременных задач.
Но я не знаю, сколько предоставляет потоковый планировщик.
Как я могу узнать это?
Я мог бы протестировать его с циклом с прогонами 9999999, однако этот тест покажет мне номер, но не правило, определяющее это число.
Изменить/добавить позже:
Я googled для "sheduler max concurrency", и я нашел (в MSDN - ссылка), что класс TashSheduler
имеет свойство MaximumConcurrencyLevel
и
Возвращает целое число, которое представляет максимальный уровень concurrency. Планировщик по умолчанию возвращает Int32.MaxValue.
Этот класс TaskSheduler используется как "базовый планировщик" для этих параллельных циклов?
Ответы
Ответ 1
Согласно MSDN:
Планировщик по умолчанию для параллельной библиотеки задач и PLINQ использует .NET Framework ThreadPool
для очереди и выполнения работы. В .NET Framework 4 ThreadPool
использует информацию, предоставляемую типом System.Threading.Tasks.Task
, чтобы эффективно поддерживать мелкозернистые parallelism (краткосрочные единицы работы), которые часто представляют собой параллельные задачи и запросы.
Посмотрев документацию ThreadPool
, он говорит:
Существует один пул потоков для каждого процесса. Начиная с .NET Framework 4 размер пула потоков для процесса зависит от нескольких факторов, таких как размер виртуального адресного пространства. Процесс может вызывать метод GetMaxThreads
для определения количества потоков. Количество потоков в пуле потоков может быть изменено с помощью метода SetMaxThreads
.