{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}
24/02/2010
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>
](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<
T>
. 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.