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