Parallel LINQ (PLINQ) в C#. Сохранение порядка (методы AsOrdered и AsUnordered)

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

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

Методы AsOrdered и AsUnordered

Чтобы переопределить поведение PLINQ по умолчанию, можно вызвать метод AsOrdered для обрабатываемой последовательности, например, следующим образом:

static void Main(string[] args)
{
    IEnumerable<int> range = Enumerable.Range(0, 360);
    var sin = range.AsParallel()
        .AsOrdered() //принудительно сохраняем порядок
        .Select(s => (Angle: s, Sin: Math.Sin(s * Math.PI / 180)));
    foreach (var i in sin)
    {
        Console.WriteLine($"Синус угла {i.Angle} равен {i.Sin}");
    }
}

В этом случае, в итоговой последовательности сохраниться порядок элементов и в консоли мы увидим следующий вывод:

Синус угла 0 равен 0
Синус угла 1 равен 0,01745240643728351
Синус угла 2 равен 0,03489949670250097
Синус угла 3 равен 0,05233595624294383
Синус угла 4 равен 0,0697564737441253
Синус угла 5 равен 0,08715574274765817

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

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

Итого

PLINQ позволяет, при необходимости, сохранять порядок элементов последовательности, используя метод AsOrdered. При этом, PLINQ самостоятельно определяет режим обработки данных — параллельно или последовательно, если пользователь явно не укажет режим обработки. Как принудительно заставить PLINQ работать в параллельном режиме — узнаем далее.

 

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии