Patrice Lamarche
Découverte de ParallelFX
Découverte du framework ParallelFX, de la Task Parallel Library et de PLINQ
Par Patrice Lamarche publié le 09/12/2007 à 22:39, lu 4640 fois, 4 pages
 3 | PLINQ
La nouveauté la plus importante du framework .net 3.5 est l'ajout de la couche Language INtegrated Query (LINQ) qui propose une syntaxe unique de requêtage de n'importe quelle source de données.
Avec ParallelFX, Microsoft propose une extension de LINQ capable de modifier le comportement de requêtes exécutées en mémoire tels que Linq to Objects and Linq to XML. PLinq permet en effet via l'utilisation d'une simple méthode d'extension de découper une requête en plusieurs tâches exécutées en parallèle et ceci de manière totalement transparente pour le développeur.
Nous avons vu que grâce au namespace System.Threading il est très simple de créer des boucles dont le traitement sera découpé en tâches parallèles, PLinq va vous permettre de faire de même et tout aussi facilement mais cette fois-ci pour vos requêtes Linq to objects et Linq to XML.
Pour paralléliser vos requêtes il vous suffit en effet d'utiliser la méthode d'extension AsParallel() comme dans l'exemple suivant :

static void Main(string[] args)

      {

 

          var a = Enumerable.Range(0, 100);

 

          Stopwatch w = new Stopwatch();

          w.Start();

 

          var nombresPair = from n in a.AsParallel()

                            where EstPair(n)

                            select n;

 

          //Effectue un traitement sur la liste (parcours la liste afin d'exécuter rééllement la requête LINQ)

          List<int> nombres = nombresPair.ToList<int>();

 

          Console.WriteLine("Ticks :" + w.ElapsedTicks.ToString());

          Console.ReadLine();

      }

Cet exemple reprend la même technique que les exemples précédents en effectuant un Thread.Sleep afin de ralentir le traitement. Bien entendu, s'il s'agissait d'un réél calcul complexe, vous verriez à l'aide du Task Manager que vos deux coeurs passent à 100% d'occupation grâce à PFX au lieu de ce concentrer sur un seul de vos coeurs comme cela est d'habitude le cas.
La méthode AsParallel utilisée dans l'exemple est une méthode d'extension proposée par la classe Statique ParallelQuery. L'objectif de cette méthode est de convertir un IEnumerable source de données de la requête LINQ en un IParallelEnumerable, interface qui hérite de IEnumerable.
En plus de ce IParallelEnumerable qui expose donc un traditionnel GetEnumerator, PFX propose la classe statique ParallelEnumerable. Cette classe expose tout un ensemble de méthodes d'extensions afin d'étendre le type IParallelEnumerable, ensemble identique à celui exposé par le type System.Linq.Enumerable qui sert à implémenter tous les opérateurs de LINQ. Ainsi au lieu d'utiliser le comportement des opérateurs classiques de LINQ, la méthode AsParallel() va vous permettre d'utiliser exactement les même opérateurs mais ayant un comportement différent puisque venant de System.Linq.ParallelEnumerable et non de System.Linq.Enumerable. C'est donc grâce à ce mécanisme que les opérateurs de LINQ permettent d'exécuter une requête en mémoire non plus de manière séquentielle mais en tâches parallèles.
 
» Démarrer une discussion