Question

J'ai un flux constant de certains éléments que je dois traiter en parallèle, j'utilise donc TPL Dataflow.Le problème est que les éléments qui partagent la même clé (semblable à un dictionnaire) doivent être traités dans un ordre FIFO et ne pas être parallèles les uns aux autres (ils peuvent être parallèles à d'autres éléments avec des valeurs différentes).

Le travail effectué est très lié au processeur avec un minimum de verrous asynchrones, ma solution consistait donc à créer un tableau de ActionBlock<T>c'est la taille de Environment.ProcessorCount sans parallélisme et postez-les selon la clé GetHashCode valeur.

Création:

_actionBlocks = new ActionBlock<Item>[Environment.ProcessorCount];
for (int i = 0; i < _actionBlocks.Length; i++)
{
    _actionBlocks[i] = new ActionBlock<Item>(_ => ProcessItemAsync(_));
}

Usage:

bool ProcessItem(Key key, Item item)
{
    var actionBlock = _actionBlocks[(uint)key.GetHashCode() % _actionBlocks.Length];
    return actionBlock.Post(item);
}

Donc ma question est : est-ce la meilleure solution à mon problème ?Est-ce que je nuit aux performances/évolutivité ?Est-ce que j'ai raté quelque chose ?

Était-ce utile?

La solution

Je pense que votre approche est raisonnable, en supposant que vous sachiez que les codes de hachage seront bien distribués.

Si vous souhaitez avoir une meilleure protection contre les mauvaises distributions, vous pouvez utiliser un plus grand nombre de ActionBlocks tout en limitant leur niveau de concurrence total en utilisant un seul personnalisé TaskScheduler partagé par tous les blocs.Vous pouvez trouver un tel planificateur dans ParallelExtensionsExtras ou sur MSDN.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top