Compartir vía


Paralelismo de datos (biblioteca TPL)

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. 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.

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. Esta clase proporciona las implementaciones paralelas basadas en método de los bucles for y foreach (For y For Each en 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. No tiene que crear los subprocesos ni poner en la cola los elementos de trabajo. En bucles básicos, no es preciso tomar bloqueos. TPL administra todo el trabajo de bajo nivel. 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). En el siguiente ejemplo de código se muestra un bucle foreach simple y su equivalente paralelo.

Nota

En esta documentación, se utilizan expresiones lambda para definir delegados en la TPL. Si no está familiarizado con las expresiones lambda de C# o Visual Basic, consulte Expresiones lambda en PLINQ y 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. En segundo plano, el programador de tareas crea particiones de la tarea según los recursos del sistema y la carga de trabajo. Cuando es posible, el programador redistribuye el trabajo entre varios subprocesos y procesadores si se desequilibra la carga de trabajo.

Nota

También puede proporcionar un programador o creador de particiones personalizado. Para más información, consulte Particionadores personalizados para PLINQ y TPL y Programadores de tareas.

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. Los tipos del asistente que habilitan esta funcionalidad son ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken y 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).

PLINQ admite el paralelismo de datos con sintaxis declarativa o de consulta. Para más información, consulte Parallel LINQ (PLINQ) (LINQ en paralelo [PLINQ]).

Title Descripción
Cómo: Escribir un bucle Parallel.For sencillo Describe cómo escribir un bucle For en cualquier matriz o colección de origen IEnumerable<T> indexable.
Cómo: Escribir un bucle Parallel.ForEach sencillo Describe cómo escribir un bucle ForEach en cualquier colección de origen IEnumerable<T>.
Cómo: Detener o interrumpir un bucle Parallel.For Describe cómo detenerse o salir de un bucle paralelo de forma que todos los subprocesos se informen de la acción.
Cómo: Escribir un bucle Parallel.For con variables locales de subproceso 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.
Cómo: Escribir un bucle Parallel.ForEach con variables locales de partición 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.
Cómo: Cancelar un bucle Parallel.For o ForEach Describe cómo cancelar un bucle paralelo utilizando un System.Threading.CancellationToken
Cómo: Acelerar cuerpos de bucle pequeños Describe una manera de acelerar la ejecución cuando el cuerpo de un bucle es muy pequeño.
Biblioteca TPL Proporciona información general sobre la biblioteca TPL.
Programación en paralelo Presenta la programación paralela en .NET Framework.

Vea también