Как работает MaxDegreeOfParallelism?

Я пытаюсь понять, как MaxDegreeOfParallelism фактически влияет на параллелизм при вызове Parallel.For. Вот код, с которым я экспериментирую:

  static void Main(string[] args)
  {
     var parallelOptions = new ParallelOptions()
        {
           MaxDegreeOfParallelism = 1000,
        };

     Parallel.For(1, 1000, parallelOptions, i =>
        {
           Console.WriteLine(i);
           Thread.Sleep(TimeSpan.FromHours(1));
        });
  }

Когда я запускаю этот код, я сразу же вижу вывод консоли от 1 до 9 (в течение ~ 0,1 секунды). Затем раз в секунду будет добавляться новое число — 10, 11, 12 и так далее. Между тем, в диспетчере задач Windows я вижу, что количество выполняемых потоков в процессе увеличивается с одним новым потоком в секунду.

Почему с этим кодом я не вижу мгновенного вывода значений от 1 до 1000?

(Я понимаю, что этот код может не иметь никакого смысла и что запускать 1000 потоков на моем ноутбуке, вероятно, плохая идея, но я хочу понять, что здесь происходит)

EDIT: Этот вопрос был, на мой взгляд, неправильно помечен как дубликат. Я понимаю, что MaxDegreeOfParallelism — это максимальная степень параллелизма. Конечно, было бы большое количество переключений контекста, если бы у меня одновременно работало 1000 потоков, но связанный вопрос не объясняет, как это на самом деле работает. Что, если я просто хочу запустить более разумное количество потоков, скажем, 32? Мой компьютер хорошо справляется с этим, но с поведением Parallel.For, описанным выше, требуется ~ 20 секунд, чтобы раскрутить такое количество потоков.


person Nitramk    schedule 17.03.2015    source источник
comment
Потому что это Max DOP, а не точное значение того, сколько вещей выполняется параллельно. Поскольку ваш компьютер не может выполнять 1000 задач одновременно (вероятно), он не пытается. MaxDOP предназначен для ограничителя, например, ограничения MaxDOP до 2 вместо количества ядер в вашем устройстве.   -  person vcsjones    schedule 18.03.2015
comment
Возможный дубликат: stackoverflow.com/questions/9538452/   -  person Greg    schedule 18.03.2015
comment
Короче говоря, если вы не используете процессор. Это будет препятствовать параллельному выполнению всех задач до максимума, который вы укажете. Это довольно распространено, в частности, для SQL.   -  person Greg    schedule 18.03.2015
comment
Мой компьютер способен одновременно запускать 1000 потоков. Если я скажу Parallel.For запускать, скажем, 32 потока, почему он ждет 1 секунду между запуском каждого нового потока?   -  person Nitramk    schedule 18.03.2015


Ответы (1)


MaxDegreeOfParallelism относится к максимальному количеству рабочих задач, которые будут запланированы в любой момент времени параллельным циклом.

Степень параллелизма автоматически регулируется реализацией класса Parallel, планировщика задач по умолчанию и пула потоков .NET. Пропускная способность оптимизируется в широком диапазоне условий.

Для очень высокой степени параллелизма вы также можете использовать метод SetMinThreads класса ThreadPool, чтобы эти потоки создавались без задержки. Если вы этого не сделаете, то алгоритм внедрения потоков пула потоков может ограничить скорость добавления потоков в пул рабочих потоков, который используется параллельным циклом. Создание необходимого количества потоков может занять больше времени, чем вы хотите.

person Tomasz Jaskuλa    schedule 17.03.2015