Vinicius Quaiato

{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}

PLINQ: Paralelismo no .Net 4 com Parallel LINQ


Fala galera. Vou abordar um pouco do PLINQ neste post.Parallel LINQ, ou PLINQ, é uma implementação do padrão LINQ que trabalha de forma paralela sobre qualquer fonte de dados em memória que implemente IEnumerable ou [IEnumerable<

T&gt;
](http://msdn.microsoft.com/en-us/library/9eekhta0.aspx), possuindo ainda a execução adiada até o momento em que a query é enumerada, ou seja, de fato utilizada.Umas das novidades é o extension [AsParallel](http://msdn.microsoft.com/en-us/library/system.linq.parallelenumerable.asparallel%28VS.100%29.aspx) que está disponível em IEnumerable e IEnumerable&lt;
T&gt;
. AsParallel diz que à partir daquele momento as operações realizadas sobre aquela fonte de dados serão executas de forma paralela, é bem simples. O código abaixo demonstra isso:
static void Main(string[] args){
var numeros = Enumerable.Range(0, 10);
var dobrados = from n in numeros.AsParallel()                   select Dobro(n);
foreach(var dobro in dobrados)        Console.WriteLine(dobro);
    Console.ReadKey();
    }


private
static int Dobro(int numero){    Thread.Sleep(500);
return numero * 2;
    }

Como vemos na linha 5 estamos chamando o método AsParallel na nossa coleção de números. Então apenas chamamos um método passando o número como parâmetro. Este método apenas congela a thread por meio segundo para que possamos notar como os valores são executados de forma paralela. Na imagem abaixo temos o resultado:Enumerando com AsParallel do PLINQO PLINQ também permite de forma simples e fácil especificar quantos processadores queremos utilizar para executar as operações paralelas. É possível especificar até um máximo de 64 processadores (ô loco meu!). Abaixo segue a alteraçãono código anterior especificando 2 processadores a serem utilizados (só tenho 2):

var dobrados = from n in numeros.AsParallel().WithDegreeOfParallelism(2)                   select Dobro(n);

Na linha 5 do nosso código adicionamos uma chamada para a extensão WithDegreeOfParallelism e passamos como parâmetro o total de processadores a ser utilizado. No mais o código permanece exatamente igual.Outro recurso bastante interessante é realizar o processamento paralelo e conseguir que o resultado seja ordenado. Isso é possível utilizando a extension AsOrdered.No código anterior poderíamos utilziar AsParallel e continuar realizando o processamento de forma paralela mas mantendo a saída ordenada, como pode ser visto abaixo:

var dobrados = from n in numeros.AsParallel().AsOrdered()                   select Dobro(n);

A saída pode ser vista na imagem abaixo:PLINQ usando AsParallel com AsOrderedExistem ainda diversos recursos no PLINQ. Em breve abordarei mais sobre eles aqui.Uma boa documentação está disponível no MSDN aqui, aqui e aqui.Comentários, críticas e sugestões, basta escrever.

Att, Vinicius Quaiato.

Voltar

Fork me on GitHub