Поделиться через


Параллелизм данных (библиотека параллельных задач)

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

Библиотека параллельных задач (TPL) поддерживает параллелизм данных через System.Threading.Tasks.Parallel класс. Этот класс предоставляет параллельные реализации циклов for и foreach на основе методов (For и For Each в Visual Basic). Вы пишете логику для цикла Parallel.For или Parallel.ForEach так же, как при написании последовательного цикла. Вам не нужно создавать потоки или элементы очереди работы. В базовых циклах не требуется устанавливать блокировки. TPL обрабатывает все низкоуровневые задачи для вас. Подробные сведения об использовании Parallel.For и Parallel.ForEach можно найти в документе Шаблоны параллельного программирования: изучение и применение параллельных шаблонов в .NET Framework 4. В следующем примере кода показан простой foreach цикл и его параллельный эквивалент.

Замечание

В этой документации используются лямбда-выражения для определения делегатов в TPL. Если вы не знакомы с лямбда-выражениями в C# или Visual Basic, см. лямбда-выражения в PLINQ и TPL.

// Sequential version
foreach (var item in sourceCollection)
{
    Process(item);
}

// Parallel equivalent
Parallel.ForEach(sourceCollection, item => Process(item));
' Sequential version        
For Each item In sourceCollection
    Process(item)
Next

' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))

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

Замечание

Вы также можете указать собственный пользовательский секционировщик или планировщик. Дополнительные сведения см. в разделах "Пользовательские секционеры для PLINQ и TPL" и "Планировщики задач".

Parallel.For Parallel.ForEach Оба метода имеют несколько перегрузок, которые позволяют останавливать или прерывать выполнение цикла, отслеживать состояние цикла на других потоках, поддерживать локальное состояние потока, завершать локальные объекты потока, управлять степенью параллелизма и т. д. Вспомогательные типы, обеспечивающие эту функциональность, включают ParallelLoopState, ParallelOptions, ParallelLoopResultи CancellationTokenCancellationTokenSource.

Дополнительные сведения см. в разделе "Шаблоны параллельного программирования: понимание и применение параллельных шаблонов с помощью .NET Framework 4".

Параллелизм данных с декларативным или запросным синтаксисом поддерживается PLINQ. Дополнительные сведения см. в статье Parallel LINQ (PLINQ).

Название Описание
Практическое руководство. Написание простого цикла Parallel.For Описывает запись цикла по любому массиву For или индексируемой IEnumerable<T> коллекции источников.
Практическое руководство. Написание простого цикла Parallel.ForEach Описывает, как написать цикл для любой исходной коллекции ForEachIEnumerable<T>.
Как: Остановить или выйти из цикла Parallel.For Описывает, как остановить или разорвать параллельный цикл, чтобы все потоки были проинформированы о действии.
Как: Написать цикл Parallel.For с Thread-Local переменными Описывает, как писать For цикл, в котором каждый поток поддерживает частную переменную, которая не отображается для других потоков, и как синхронизировать результаты из всех потоков после завершения цикла.
Как: Написать цикл Parallel.ForEach с переменными Partition-Local Описывает, как писать ForEach цикл, в котором каждый поток поддерживает частную переменную, которая не отображается для других потоков, и как синхронизировать результаты из всех потоков после завершения цикла.
Практическое руководство. Отмена цикла Parallel.For или ForEach Описывается, как отменить параллельный цикл с помощью System.Threading.CancellationToken
Как ускорить выполнение небольших циклов Описывает один из методов ускорения исполнения, когда тело цикла очень мало.
Библиотека параллельных задач (TPL) Общие сведения о библиотеке параллельных задач.
Параллельное программирование В этой статье описывается параллельное программирование в .NET Framework.

См. также