c# - threads - Máximo Grado de Paralelismo para AsParalelo()
parallel.foreach async (3)
Puede usar ParallelEnumerable.WithDegreeOfParallelism
:
Establece el grado de paralelismo a utilizar en una consulta. El grado de paralelismo es el número máximo de tareas que se ejecutan simultáneamente para procesar la consulta.
var result = Tabel.AsEnumberable()
.AsParallel()
.WithDegreeOfParallelism(number)
.Where(/* predicate */);
Editar:
@svick proporcionó una excelente en ParallelOptions.MaxDegreeOfPalallelism vs PLINQ WithDegreeOfPalallelism que enfatiza la diferencia entre los dos:
Los trabajos paralelos que utilizan un concepto debajo de las coberturas que denominamos tareas de replicación. El concepto es que un bucle comenzará con una tarea para procesar el bucle, pero si hay más subprocesos disponibles para ayudar en el procesamiento, se crearán tareas adicionales para ejecutarse en esos subprocesos. Esto permite la minimización del consumo de recursos. Dado esto, sería incorrecto afirmar que ParallelOptions permite la especificación de un DegreeOfParallelism, porque en realidad es un grado máximo : el ciclo comienza con un grado de 1, y puede funcionar hasta cualquier máximo que se especifique cuando los recursos estén disponibles.
PLINQ es diferente. Algunos operadores de consultas estándar importantes en PLINQ requieren comunicación entre los subprocesos involucrados en el procesamiento de la consulta, incluidos algunos que dependen de una barrera para permitir que los subprocesos operen en el paso de bloqueo. El diseño de PLINQ requiere que una cantidad específica de subprocesos esté activamente involucrada para que la consulta pueda progresar. Por lo tanto, cuando especifica un DegreeOfParallelism para PLINQ, está especificando el número real de subprocesos que estarán involucrados, en lugar de solo un máximo.
Mientras usamos Parallel.ForEach
, tenemos la opción de definir las opciones de Paralelo y establecer el Grado Máximo de Paralelismo como:
Parallel.ForEach(values, new ParallelOptions {MaxDegreeOfParallelism = number}, value = > {
// Do Work
})
Pero mientras hace PLINQ como:
Tabel.AsEnumberable()
.AsParallel()
.Where(//Logic)
No pude encontrar una manera de establecer MaxDegreeOfParallelism
. Miré hacia arriba en la red también, pero no encontré nada. Como alguien encontró una forma de evitar esto? Cualquier ayuda es apreciada.
Sí, ciertamente puedes hacer eso. Solo usa el método de extensión WithDegreeOfParallelism
yourSequence.AsParallel()
.WithDegreeOfParallelism(5)//Whatever number as you like
.Where(...);
<IEnumerable>.AsParallel()
.WithDegreeOfParallelism(n)
.Where(x=>)