web-dev-qa-db-fra.com

Degré de parallélisme maximal pour AsParallel ()

En utilisant Parallel.ForEach, nous avons la possibilité de définir les options Parallèle et de définir le degré maximum de parallélisme comme suit:

Parallel.ForEach(values, new ParallelOptions {MaxDegreeOfParallelism = number}, value = > {
    // Do Work
})

Mais tout en faisant PLINQ comme:

Tabel.AsEnumberable()
     .AsParallel()
     .Where(//Logic)

Je n'ai pas réussi à trouver un moyen de définir MaxDegreeOfParallelism. J'ai aussi regardé sur le net, mais je n'ai rien trouvé. Comme quelqu'un a trouvé un moyen de contourner cela? Toute aide est appréciée. 

22
codingpirate

Vous pouvez utiliser ParallelEnumerable.WithDegreeOfParallelism :

Définit le degré de parallélisme à utiliser dans une requête. Diplôme de Le parallélisme est le nombre maximal de tâches simultanément exécutées que sera utilisé pour traiter la requête.

var result = Tabel.AsEnumberable()
                  .AsParallel()
                  .WithDegreeOfParallelism(number)
                  .Where(/* predicate */);

Modifier:

@svick a fourni un excellent résultat sur ParallelOptions.MaxDegreeOfParallelism vs PLINQ avec WithDegreeOfParallelism} _ qui souligne la différence entre les deux:

Les travaux parallèles utilisent un concept de sous-couverture que nous appelons des tâches de réplication. Le concept est qu'une boucle commencera avec une tâche pour le traitement de la boucle, mais si plusieurs threads deviennent disponibles pour aider au traitement, des tâches supplémentaires seront créées pour s'exécuter sur ces threads. Cela permet de minimiser la consommation de ressources. Compte tenu de cela, il serait inexact de préciser que ParallelOptions permet de spécifier un degré DegreeOfParallelism, car il s'agit en réalité d'un degré maximum: la boucle commence par un degré de 1 et peut aller jusqu'au maximum spécifié les ressources deviennent disponibles.

PLINQ est différent. Certains opérateurs de requête standard importants dans PLINQ nécessitent une communication entre les threads impliqués dans le traitement de la requête, y compris certains qui reposent sur une barrière pour permettre aux threads de fonctionner en phase de verrouillage. La conception de PLINQ nécessite qu'un nombre spécifique de threads soient activement impliqués pour que la requête progresse. Ainsi, lorsque vous spécifiez un DegreeOfParallelism pour PLINQ, vous spécifiez le nombre réel de threads impliqués, plutôt qu’un maximum.

41
Yuval Itzchakov

Oui, vous pouvez certainement le faire. Vous venez d'utiliser WithDegreeOfParallelism méthode d'extension

yourSequence.AsParallel()
    .WithDegreeOfParallelism(5)//Whatever number as you like
    .Where(...);
8
Sriram Sakthivel
<IEnumerable>.AsParallel()
.WithDegreeOfParallelism(n)
.Where(x=>)
0
letscode