Compartir a través de


Paralelismo de datos (biblioteca paralela de tareas)

El paralelismo de datos hace referencia a escenarios en los que se realiza la misma operación simultáneamente (es decir, en paralelo) en los elementos de una colección o matriz de origen. En las operaciones paralelas de datos, la colección de origen se particiona para que varios subprocesos puedan funcionar simultáneamente en distintos segmentos.

La biblioteca paralela de tareas (TPL) admite paralelismo de datos a través de la System.Threading.Tasks.Parallel clase . Esta clase proporciona las implementaciones paralelas basadas en métodos de los bucles for y foreach (For y For Each en Visual Basic). Escribes la lógica para un bucle Parallel.For o Parallel.ForEach de manera similar a cómo escribirías 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 Patrones para programación paralela: Descripción y aplicación de patrones paralelos con .NET Framework 4. En el ejemplo de código siguiente se muestra un bucle simple foreach y su equivalente paralelo.

Nota:

En esta documentación se usan expresiones lambda para definir delegados en TPL. Si no está familiarizado con las expresiones lambda en 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 se ejecuta un bucle paralelo, el TPL particiona el origen de datos para que el bucle pueda funcionar en varias partes simultáneamente. En segundo plano, el Programador de tareas particiona la tarea en función de los recursos del sistema y la carga de trabajo. Cuando sea posible, el programador redistribuye el trabajo entre varios subprocesos y procesadores si la carga de trabajo se vuelve desequilibrada.

Nota:

También puede proporcionar su propio particionador o programador personalizado. Para obtener más información, vea Particionadores personalizados para PLINQ y TPL yProgramadores de tareas.

Tanto los Parallel.For métodos como Parallel.ForEach tienen varias sobrecargas que permiten detener o interrumpir la ejecución del bucle, supervisar el estado del bucle en otros subprocesos, mantener el estado local del subproceso, finalizar los objetos locales del subproceso, controlar el grado de simultaneidad, etc. Los tipos auxiliares que habilitan esta funcionalidad incluyen ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationTokeny CancellationTokenSource.

Para obtener más información, vea Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4.

PLINQ admite el paralelismo de datos con sintaxis declarativa o similar a consultas. Para obtener más información, vea Parallel LINQ (PLINQ).

Título Descripción
Cómo: Escribir un bucle Parallel.For sencillo Describe cómo escribir un For bucle sobre cualquier matriz o colección de origen indexable IEnumerable<T> .
Cómo: Escribir un bucle Parallel.ForEach sencillo Describe cómo escribir un ForEach bucle sobre cualquier IEnumerable<T> colección de origen.
Cómo: Detener o interrumpir un bucle Parallel.For Describe cómo detener o interrumpir un bucle paralelo para que todos los subprocesos se informen de la acción.
Cómo escribir un bucle Parallel.For con variables de Thread-Local Describe cómo escribir un For bucle en el que cada subproceso mantiene una variable privada que no está visible para ningún otro subproceso y cómo sincronizar los resultados de todos los subprocesos cuando se completa el bucle.
Cómo escribir un bucle Parallel.ForEach con variables Partition-Local Describe cómo escribir un ForEach bucle en el que cada subproceso mantiene una variable privada que no está visible para ningún otro subproceso y cómo sincronizar los resultados de todos los subprocesos cuando se completa el bucle.
Cómo: Cancelar un bucle Parallel.For o ForEach Describe cómo cancelar un bucle paralelo mediante 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 paralela de tareas (TPL) Proporciona información general sobre la biblioteca paralela de tareas.
Programación en Paralelo Presenta la programación paralela en .NET Framework.

Consulte también