Paralelismo de datos (biblioteca TPL)Data Parallelism (Task Parallel Library)

El paralelismo de datos hace referencia a los escenarios en los que la misma operación se realiza simultáneamente (es decir, en paralelo) en elementos de una colección o matriz de origen.Data parallelism refers to scenarios in which the same operation is performed concurrently (that is, in parallel) on elements in a source collection or array. En las operaciones paralelas de datos, se crean particiones de la colección de origen para que varios subprocesos puedan funcionar simultáneamente en segmentos diferentes.In data parallel operations, the source collection is partitioned so that multiple threads can operate on different segments concurrently.

La biblioteca TPL (Task Parallel Library, biblioteca de procesamiento paralelo basado en tareas) admite el paralelismo de datos a través de la clase System.Threading.Tasks.Parallel.The Task Parallel Library (TPL) supports data parallelism through the System.Threading.Tasks.Parallel class. Esta clase proporciona las implementaciones paralelas basadas en método de los bucles for y foreach (For y For Each en Visual Basic).This class provides method-based parallel implementations of for and foreach loops (For and For Each in Visual Basic). Se escribe la lógica del bucle para un bucle Parallel.For o Parallel.ForEach de forma muy similar a como se escribiría un bucle secuencial.You write the loop logic for a Parallel.For or Parallel.ForEach loop much as you would write a sequential loop. No tiene que crear los subprocesos ni poner en la cola los elementos de trabajo.You do not have to create threads or queue work items. En bucles básicos, no es preciso tomar bloqueos.In basic loops, you do not have to take locks. TPL administra todo el trabajo de bajo nivel.The TPL handles all the low-level work for you. Para obtener información detallada sobre el uso de Parallel.For y Parallel.ForEach, descargue el documento Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4 (Patrones de programación en paralelo: descripción y aplicación de los patrones en paralelo con .NET Framework 4).For in-depth information about the use of Parallel.For and Parallel.ForEach, download the document Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4. En el siguiente ejemplo de código se muestra un bucle foreach simple y su equivalente paralelo.The following code example shows a simple foreach loop and its parallel equivalent.

Nota

En esta documentación, se utilizan expresiones lambda para definir delegados en la TPL.This documentation uses lambda expressions to define delegates in TPL. Si no está familiarizado con las expresiones lambda de C# o Visual Basic, consulte Lambda Expressions in PLINQ and TPL (Expresiones lambda en PLINQ y TPL).If you are not familiar with lambda expressions in C# or Visual Basic, see Lambda Expressions in PLINQ and 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))

Cuando un bucle paralelo se ejecuta, la TPL crea particiones del origen de datos para que el bucle pueda funcionar simultáneamente en varias partes.When a parallel loop runs, the TPL partitions the data source so that the loop can operate on multiple parts concurrently. En segundo plano, el programador de tareas crea particiones de la tarea según los recursos del sistema y la carga de trabajo.Behind the scenes, the Task Scheduler partitions the task based on system resources and workload. Cuando es posible, el programador redistribuye el trabajo entre varios subprocesos y procesadores si se desequilibra la carga de trabajo.When possible, the scheduler redistributes work among multiple threads and processors if the workload becomes unbalanced.

Nota

También puede proporcionar un programador o creador de particiones personalizado.You can also supply your own custom partitioner or scheduler. Para más información, consulte Custom Partitioners for PLINQ and TPL (Particionadores personalizados para PLINQ y TPL) y Programadores de tareas.For more information, see Custom Partitioners for PLINQ and TPL and Task Schedulers.

Los métodos Parallel.For y Parallel.ForEach tienen varias sobrecargas que permiten detener o ejecutar la ejecución de bucles, supervisar el estado del bucle en otros subprocesos, mantener el estado de subprocesos locales, finalizar los objetos de subprocesos locales, controlar el grado de simultaneidad, etc.Both the Parallel.For and Parallel.ForEach methods have several overloads that let you stop or break loop execution, monitor the state of the loop on other threads, maintain thread-local state, finalize thread-local objects, control the degree of concurrency, and so on. Los tipos del asistente que habilitan esta funcionalidad son ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken y CancellationTokenSource.The helper types that enable this functionality include ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken, and CancellationTokenSource.

Para obtener más información, vea Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4 (Patrones de programación en paralelo: descripción y aplicación de los patrones en paralelo con .NET Framework 4).For more information, see Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4.

PLINQ admite el paralelismo de datos con sintaxis declarativa o de consulta.Data parallelism with declarative, or query-like, syntax is supported by PLINQ. Para más información, consulte Parallel LINQ (PLINQ) (LINQ en paralelo [PLINQ]).For more information, see Parallel LINQ (PLINQ).

TitleTitle DescripciónDescription
Cómo: Escribir un bucle Parallel.For sencilloHow to: Write a Simple Parallel.For Loop Describe cómo escribir un bucle For en cualquier matriz o colección de origen IEnumerable<T> indexable.Describes how to write a For loop over any array or indexable IEnumerable<T> source collection.
Cómo: Escribir un bucle Parallel.ForEach sencilloHow to: Write a Simple Parallel.ForEach Loop Describe cómo escribir un bucle ForEach en cualquier colección de origen IEnumerable<T>.Describes how to write a ForEach loop over any IEnumerable<T> source collection.
Cómo: Detener o interrumpir un bucle Parallel.ForHow to: Stop or Break from a Parallel.For Loop Describe cómo detenerse o salir de un bucle paralelo de forma que todos los subprocesos se informen de la acción.Describes how to stop or break from a parallel loop so that all threads are informed of the action.
Cómo: Escribir un bucle Parallel.For con variables locales de subprocesoHow to: Write a Parallel.For Loop with Thread-Local Variables Describe cómo escribir un bucle For en el que cada subproceso mantiene una variable privada que no está visible para cualquier otro subproceso y cómo sincronizar los resultados de todos los subprocesos cuando el bucle se completa.Describes how to write a For loop in which each thread maintains a private variable that is not visible to any other threads, and how to synchronize the results from all threads when the loop completes.
Cómo: Escribir un bucle Parallel.ForEach con variables locales de particiónHow to: Write a Parallel.ForEach Loop with Partition-Local Variables Describe cómo escribir un bucle ForEach en el que cada subproceso mantiene una variable privada que no está visible para cualquier otro subproceso y cómo sincronizar los resultados de todos los subprocesos cuando el bucle se completa.Describes how to write a ForEach loop in which each thread maintains a private variable that is not visible to any other threads, and how to synchronize the results from all threads when the loop completes.
Cómo: Cancelar un bucle Parallel.For o ForEachHow to: Cancel a Parallel.For or ForEach Loop Describe cómo cancelar un bucle paralelo utilizando un System.Threading.CancellationTokenDescribes how to cancel a parallel loop by using a System.Threading.CancellationToken
Cómo: Acelerar cuerpos de bucle pequeñosHow to: Speed Up Small Loop Bodies Describe una manera de acelerar la ejecución cuando el cuerpo de un bucle es muy pequeño.Describes one way to speed up execution when a loop body is very small.
Biblioteca TPLTask Parallel Library (TPL) Proporciona información general sobre la biblioteca TPL.Provides an overview of the Task Parallel Library.
Programación en paraleloParallel Programming Presenta la programación paralela en .NET Framework.Introduces Parallel Programming in the .NET Framework.

Vea tambiénSee also