PLINQ

Parallel Extensions (PLINQ) numele de dezvoltare pentru o bibliotecă de concurgență gestionată dezvoltată printr-o colaborare între Microsoft Research și echipa CLR de la Microsoft. Biblioteca a fost lansată în versiunea 4.0 a .NET Framework.[1] Este compus din două părți: paralel LINQ (PLINQ) și Task Parallel Library (TPL).[2][3] Acesta constă, de asemenea, dintr-un set de structuri de coordonare a datelor (CDS) - seturi de structuri de date utilizate pentru sincronizarea și coordonarea executării sarcinilor concurente.[4]

O interogare PLINQ este asemănătoare cu una LINQ. Diferența este ca PLINQ încearcă să pună în valoare toate procesoarele sistemului. Realizează acest lucru prin împărțirea sursei de date în mai multe segmente și apoi executând interogarea pe fiecare segment, pe fire de execuție diferite, rulând în paralel pe mai multe procesoare.

Când este folosit modul secvențial?

[modificare | modificare sursă]

PLINQ va încerca întotdeauna să execute o interogare cel puțin la fel de rapid ca și cum ar rula secvențial. Mai exact caută operatori sau combinații de operatori care de obicei fac execuția mai lentă in modul paralel. Când gasește aceste combinații rulează în mod secvențial.

După mai multe teste utilizatorul poate realiza că o interogare poate rula mai repede în modul paralel. În aceste cazuri utilizatorul poate folosi metoda WithExecutionMode.

static void ForceParallel()
{
    var customers = GetCustomers();
    var parallelQuery = (from cust in customers.AsParallel()
                            .WithExecutionMode(ParallelExecutionMode.ForceParallelism)
                         where cust.City == "Berlin" 
                         select cust.CustomerName)
                        .ToList();
}

Diferența între o interogare simplă LINQ și una PLINQ este folosirea metodei AsParalel în sursa de date și executarea interogării folosind ForAll.

   var source = Enumerable.Range(100, 20000);

           
            var parallelQuery = from num in source.AsParallel()
                                where num % 10 == 0
                                select num;

            // Rezultatele sunt procesate in paralel
            parallelQuery.ForAll((e) => DoSomething(e));
  1. ^ „What's New in the .NET Framework 4”. Accesat în . 
  2. ^ „Programming in the Age of Concurrency: Concurrent Programming with PFX”. Accesat în . 
  3. ^ „MSDN Magazine: Task Parallel Library”. Arhivat din original la . Accesat în . 
  4. ^ „June 2008 CTP - Parallel Extensions to the .NET FX”. Accesat în .