Параллелизм данных (библиотека параллельных задач)
Термин параллелизм данных относится к сценариям, в которых одинаковые операции для элементов исходной коллекции или массива выполняются одновременно (то есть параллельно). Параллелизм данных с декларативным синтаксисом поддерживается несколькими перегрузками метода For и метода ForEach в классе System.Threading.Tasks.Parallel. В параллельных операциях с данными исходная коллекция разделяется на части, чтобы несколько потоков могли одновременно работать с различными сегментами. Библиотека параллельных задач поддерживает параллелизм данных с помощью класса System.Threading.Tasks.Parallel. Этот класс предоставляет основанные на методе параллельные реализации циклов for и foreach (For и For Each в Visual Basic). Запись логики для цикла Parallel.For или Parallel.ForEach похожа на запись последовательного цикла. Нет необходимости создавать потоки или очередь рабочих элементов. В основных циклах нет необходимости принимать блокировки. Библиотека параллельных задач обрабатывает все низкоуровневые работы. В следующем примере кода показан простой цикл foreach и его параллельный эквивалент.
![]() |
---|
В этой документации для определения делегатов в библиотеке параллельных задач используются лямбда-выражения.Сведения о лямбда-выражениях в C# или Visual Basic см. в разделе Лямбда-выражения в PLINQ и библиотеке параллельных задач. |
' Sequential version
For Each item In sourceCollection
Process(item)
Next
' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))
// Sequential version
foreach (var item in sourceCollection)
{
Process(item);
}
// Parallel equivalent
Parallel.ForEach(sourceCollection, item => Process(item));
При выполнении параллельного цикла библиотека параллельных задач разделяет источник данных таким образом, чтобы цикл мог одновременно работать с несколькими частями. В фоновом режиме планировщик заданий разделяет задачу на основе системных ресурсов и рабочей нагрузки. По возможности планировщик перераспределяет работы между несколькими потоками и процессорами, если рабочая нагрузка становится несбалансированной.
![]() |
---|
Можно также указать собственный пользовательский модуль разделения или планировщик.Дополнительные сведения см. в разделах Пользовательские разделители для PLINQ и TPL и Планировщики заданий. |
Методы Parallel.For и Parallel.ForEach имеют несколько перегрузок, которые позволяют остановить или прервать выполнение цикла, отследить состояние цикла в других потоках, поддержать локальное состояние потока, завершить локальные объекты потока, контролировать степень параллелизма и т. д. Вспомогательные типы, обеспечивающие эту функциональную возможность, включают ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken и CancellationTokenSource.
Дополнительные сведения см. в разделе Параллелизм данных (библиотека параллельных задач).
В PLINQ поддерживается распараллеливание данных с декларативным синтаксисом или с синтаксисом, похожим на синтаксис запросов. Дополнительные сведения см. в разделе Parallel LINQ (PLINQ).
Связанные разделы
Заголовок |
Описание |
---|---|
Практическое руководство. Написание простого цикла 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 |
Практическое руководство. Повышение скорости выполнения небольших тел циклов |
Описывает один из способов увеличения скорости выполнения, когда тело цикла имеет очень маленький размер. |
Содержит общие сведения о библиотеке параллельных задач. |
|
Содержит вводную информацию по параллельному программированию на платформе .NET Framework. |