Параллельный .ForEach против AsParallel(). ForAll
У меня есть огромная коллекция, которую я хотел бы обрабатывать каждый из объектов параллельно. Выполнение того же синхронно обычно включает простой "foreach".
Просто интересно, что использовать в моем сценарии, то есть либо Parallel.ForEach, либо MyCollection.AsParallel(). ForAll().
Можете ли вы рассказать мне о преимуществах использования одного и другого.
Ответы
Ответ 1
Как я вижу это, если все, что вы хотите сделать, это распараллелить foreach
, вы должны использовать его параллельную версию, которая Parallel.ForEach()
.
ParallelEnumerable.ForAll()
предназначен для конкретного случая, когда у вас есть запрос LINQ, за которым следует foreach
, и вы хотите распараллелить их оба. Итак, что вы делаете, так это то, что вы распараллеливаете запрос LINQ, добавляя AsParallel()
, а затем вы распараллеливаете foreach
, изменяя его на ForAll()
.
Ответ 2
Время и выиграть победителя.
Я обнаружил, что Parallel.ForEach лучше работает в самых восхитительно параллельных сценариях. Казалось бы, он использует более совершенную модель балансировки работы. PLINQ в первую очередь направлен на параллельные запросы.
Ответ 3
Мои 2 цента:
С помощью ForAll
вы можете указать желаемый уровень parallelism с помощью метода расширения WithDegreeOfParallelism
.
С ForEach
вы можете ограничить максимальный уровень.
В принципе, вы можете заставить ForAll
использовать больше потоков.
Ответ 4
У вас есть возможность заказать элементы с помощью AsParallel(). AsOrdered(). Заказ в Parallel.ForEach не из коробки, нам нужно это сделать.