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


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

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

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

Примечание.

В этой документации для определения делегатов в библиотеке параллельных задач используются лямбда-выражения. Если вы не знакомы с лямбда-выражениями в 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))

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

Примечание.

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

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

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

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

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

См. также