Можно ли определить порядок выполнения в Parallel.For? - PullRequest
3 голосов
/ 29 сентября 2011
// parameters.Count == 10
// actualFreeLicenses == 2
Parallel.For(0, parameters.Count, new ParallelOptions() 
                    {
                        MaxDegreeOfParallelism = actualFreeLicenses
                    }, i =>
                    {
                        ExternalProgram(i);
                    }
);

Когда я выполняю приведенный выше код, я замечаю, что значение i, переданное методу ExternalProgram, равно 1 и 6, позже 2 и 7, позже 3 & 8 ...

Если у меня 14 параметров и 2 лицензии, всегда запускаются 1 и 8, позже 2 и 9 ...

Можно ли определить порядок: сначала 1 и 2, затем 3 и 4 и т. Д.?

Ответы [ 5 ]

10 голосов
/ 29 сентября 2011

Как насчет использования Queue / ConcurrentQueue и удаления элементов из тела в вашем параллельном цикле? Это обеспечит сохранение порядка.

4 голосов
/ 29 сентября 2011

Если вы используете Parallel, порядок их выполнения не имеет значения, поэтому «Parallel».Вам следует использовать последовательный рабочий процесс, если заказ актуален для вас.

2 голосов
/ 29 сентября 2011

Звучит так, как будто вы могли бы хотеть использовать Parallel.ForEach с настраиваемым разделителем вместо этого - но не забывайте, что он на самом деле не выполняет "1 & 6, затем 2 & 7 "- он делает (скажем) 1 в потоке 1, 6 в потоке 2, затем 7 в потоке 2 и т. Д. Он не запускает пар процессов как таковых.

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

1 голос
/ 29 сентября 2011

Если бы вы могли переключиться на использование ForEach (после генерации диапазона чисел, возможно, используя IEnumerable.Range), вы могли бы использовать одну из перегрузок, которыезанимает Partitioner<T>.Эта третья ссылка включает в себя образец разделителя, который предоставляет один элемент за раз.

0 голосов
/ 29 сентября 2011

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

...