Getting deeper with TPL & async (Spanish version)

  • View
    63

  • Download
    1

Embed Size (px)

DESCRIPTION

Presentation about the Task Parallel Library and the new async paradigm in .NET Framework.

Text of Getting deeper with TPL & async (Spanish version)

  • 1. Irn Reyes Fleitas

2. Temas: TPL Paralelizacin de cdigo imperativo. Programacin Paralela con tareas(Task). Colecciones de Concurrencia y Pipelines. Estructuras para la coordinacin de los datos. Async 3. Evolucin C# 4. Paralelizacin de cdigo imperativoParallel.Invoke, Parallel Loops, Cancelando, Excepciones, Particionando . Programacin Paralela con tareas(Task)Task, TimeOuts, Cancelando, Excepciones, Retornando valores. Colecciones de Concurrencia y PipelinesConcurrentQueue, ConcurrentStack, ConcurrentBag, BlockingCollection,ConcurrentDictionary. 5. Parallel Class( System.Threading.Tasks )Parallel.ForParallel.ForEachParallel.Invoke 6. Parallel.InvokeLa manera ms simple de paralelizar varios mtodos.Sintaxis:Invoke( Action [] )Invoke( ParallelOptions, Action [] )No se tiene garanta de orden.No retorna hasta que cadainvocacin no hay finalizado.GoToRiver GoToPark GoToZoo GoToPlainAreaParallel.Invoke(Walk.GoToPark, Walk.GoToRiver, Walk.GoToZoo, Walk.GoToPlainArea);Parallel.Invoke(() => Walk.GoToPark("Santiago"),Walk.GoToRiver,delegate() { Walk.GoToZoo("26st"); },Walk.GoToPlainArea);PatrnFork/Join 7. 3 posibles escenarios de paralelismo EscenarioIdealEjemplo hipottico con una arquitectura con4 ncleos lgicos.1era ejecucinGoToZooGoToRiverGoToParkGoToPlainArea2da ejecucinGoToParkGoToRiverGoToPlainAreaGoToZoo3era ejecucinGoToZooGoToPlainAreaGoToRiverGoToPark 8. Ventajas y Desventajas1. Es un mtodo muy simple de lograr paralelismo sin tareas, ni hilos.1. Mtodos con notables diferencias en cuanto al tiempo de ejecucin.2. Cada llamada crea una sobrecarga antes de correr los mtodos.3. Como todo cdigo en paralelo, esta expuesto a existencias deinterdependencia e incontrolables interacciones.4. No tiene garanta de orden. 9. Anlisis de tiempo con respecto al secuencialWalk.GoToPark();Walk.GoToRiver();Walk.GoToZoo();Walk.GoToPlainArea();Ejemplo hipottico (figuras)con unaarquitectura con 4 ncleos lgicos ymediciones con 2 ncleos lgicosParallel.Invoke(Walk.GoToPark, Walk.GoToRiver, Walk.GoToZoo, Walk.GoToPlainArea); 10. Parallel.ForVersin paralelizada del clsico for.Sintaxis:For( Int32, Int32, Action )For( Int32, Int32, Action )List data = new List(){"Estamos","paralelizando","el","for","y","el","foreach"};Tradicional Paralelizadofor (int i = 0; i < data.Count; i++){Console.Write(i);}Parallel.For(0, data.Count, x =>{Console.Write(x);});No tiene por que cumplirse el orden.Tener en cuenta si los elementosestan relacionados entre si.Desde LowerBound a UpperBound.El primer parmetro es inclusivo,el segundo exclusivo.Load-BalancePequeos bodies. 11. Anlisis de tiempo con respecto al secuencial(RayTracing)void Render(Scene scene, Color[,] rgb){for (int y = 0; y < screenHeight; y++){for (int x = 0; x < screenWidth; x++)rgb[x,y] = TraceRay(new Ray(scene,x,y));}}void Render(Scene scene, Color[,] rgb){Parallel.For(0, screenHeight, delegate(int y){for (int x = 0; x < screenWidth; x++)rgb[x,y] = TraceRay(new Ray(scene,x,y));});}Ocho ncleos y 350 x 350Secuencial: 1.7 fpsParalelo : 12 fpsDos ncleos y 350 x 350Secuencial: 1.0 fpsParalelo : 2.0 fpsDos ncleos y 578 x 485Secuencial: 0.5 fpsParalelo : 1.0 fps 12. Anlisis de tiempo con respecto al secuencial(Primos)List primes = new List();int cotaSup = 50000;for (int i = 2; i < cotaSup; i++){if (isPrime(i))primes.Add(i);}Parallel.For(2, cotaSup, (i) =>{if (isPrime(i))primes.Add(i);});0.5 segundos0.2 segundos0.5/0.2 = 2.5xEjemplo hipottico (figuras)con unaarquitectura con 4 ncleos lgicos ymediciones con 2 ncleos lgicos 13. F#let sentences = [|"Estamos"; "paralelizando"; "el"; "for"; "y"; "el";"foreach"|]for index=0 to sentences.Length doprintfn "%d" indexprintfn ""let accion indice =printfn "%d" indiceParallel.For(0,sentences.Length, new Action(accion))Console.ReadKey(); 14. Parallel.ForEachVersin paralelizada del clsico foreach.Sintaxis:ForEach ( IEnumerable , Action )ForEach ( IEnumerable , Action )List data = new List(){"Estamos","paralelizando","el","for","y","el","foreach"};foreach (var items in data){Console.Write(items + " ");}Tradicional ParalelizadoParallel.ForEach(data, x =>{Console.Write(x + " ");}); 15. Anlisis de tiempo con respecto al secuencialEjemplo hipottico (figuras)con unaarquitectura con 4 ncleos lgicos ymediciones con 2 ncleos lgicosforeach (var i in inputData){if (isPrime(i))resultData[indice] = i;indice++;}28 segundos14 segundosvar op = Partitioner.Create(inputData);Parallel.ForEach(op, (item, loopState, index) =>{28/14 = 2xif (isPrime(item))resultData[index] = item;}); 16. Como paramos los ciclos?(Cancelando)ParallelLoopState ParallelLoopResultParallelLoopResult loopResult1 = Parallel.For(0, 10, (x, state) =>{if (x < 5)Console.WriteLine(x);elsestate.Stop();});ParallelLoopResult loopResult2 = Parallel.ForEach(data, (x, state) =>{if (!x.Equals("y"))Console.WriteLine(x);elsestate.Break();});Console.WriteLine(loopResult1.LowestBreakIteration);Console.WriteLine(loopResult1.IsCompleted);Console.WriteLine(loopResult2.LowestBreakIteration);Console.WriteLine(loopResult2.IsCompleted); 17. Manejo de ExcepcionesAggregateExceptionFormato:try{..........}catch (AggregateException aggEx){foreach (Exception ex in aggEx.InnerExceptions){Console.WriteLine(string.Format("Caught exception '{0}'",ex.Message));}} 18. Manejo de ExcepcionesEjemplo:try{ParallelLoopResult loopResult = Parallel.For(0, 10, (x, state) =>{if (x < 5)Console.WriteLine(x);else{var ex = "Excepcin en el ndice " + x;throw new InvalidDataException(ex);}});Console.WriteLine("Ciclo for completado: {0}", loopResult.IsCompleted);}catch (AggregateException aggEx){foreach (var innerException in aggEx.InnerExceptions){//Pueden haber 2 excepciones a causa del paralelismo.Console.WriteLine("Excepcion capturada: " + innerException.Message);}} 19. ParallelOptionsParallelOptions.MaxDegreeOfParallelismParallelOptions.TaskSchedulerParallelOptions.CancellationTokenSe utilizan en losmtodos de Parallel.var source = Enumerable.Range(8, 2000).ToArray();double[] result = new double[source.Length];ParallelOptions parallelOptions = new ParallelOptions();parallelOptions.MaxDegreeOfParallelism = Environment.ProcessorCount*2; //EjemploParallel.ForEach(Partitioner.Create(8, source.Length),parallelOptions, range =>{for (int i = range.Item1; i < range.Item2; i++)result[i] = source[i]*Math.E;}); 20. ParticionandoParticin por rangos Particin por bloquesPartitioner.Create(1,40)Parallel.ForEach(Partitioner.Create(10, 200), range =>{Console.WriteLine("{0},{1}",range.Item1,range.Item2);for (int i = range.Item1; i < range.Item2; i++){data[i] = data[i]*i;}});Optimizando el particionado segn el nmero de ncleos.Partitioner.Create(1,40, ((numeroDeElementos/numeroDeNucleos)+1))System.Environment.ProcessorCountSintaxis:Create ( IEnumerable )Create ( Int32, Int32)Create ( Int32, Int32, Int32) 21. Paralelizacin de cdigo imperativoParallel.Invoke, Parallel Loops, Cancelando, Excepciones, Particionando . Programacin Paralela con tareas(Task)Task, TimeOuts, Cancelando, Excepciones, Retornando valores. Parallel Linq (PLinq)Operadores, Cancelando, Agregaciones, Excepciones. Colecciones de Concurrencia y PipelinesConcurrentQueue, ConcurrentStack, ConcurrentBag, BlockingCollection,ConcurrentDictionary. 22. Task 23. Task - Scheduling 24. Ciclo de vida y estado de una tareaEnumTaskStatusMiembros:CreatedWaitingForActivationWaitingToRunRunningWaitingForChildrenToCompleteRanToCompletionCanceledFaulted 25. Invocando TareasGenerateSomething GenerateNothingParallel.Invoke(GenerateSomething,() => GenerateNothing());//Los mtodos no estn corriendo todava, pero las tareasestn listas para empezar.//El estado para ambas tareas es TaskStatus.Created.var task1 = new Task(GenerateSomething);var task2 = new Task(() => GenerateNothing());task1.Start();task2.Start();Task.WaitAll(task1, task2);var task1 = Task.Factory.StartNew(() => GenerateNothing()); 26. TimeOutsvar task1 = new Task(GenerateSomethingTimeOut);var task2 = new Task(() => GenerateNothing());task1.Start();task2.Start();if(!Task.WaitAll(new Task[]{task1,task2},300)){Console.WriteLine("GenerateSomething y GenerateNothing han tardado ms de300ms");}if(!task1.Wait(300)){Console.WriteLine("GenerateSomething ha tardado ms de 300ms");} 27. Manejando excepciones con las Taskstatic void GenerateSomethingCancel(CancellationToken cancellationToken){cancellationToken.ThrowIfCancellationRequested();Console.WriteLine("GenerateSomething");Thread.Sleep(3000);if (sw.Elapsed.Seconds > 1)throw new TimeoutException("La tarea se demor mas de 1 segundos");cancellationToken.ThrowIfCancellationRequested();}try{// Espera por que todas las tareas finalicen en menos de 3 segundosif (!Task.WaitAll(new Task[] { task1, task2 }, 3000)){Console.WriteLine("GenerateSomething y GenerateNothing han tardado ms de 300ms en terminar");Console.WriteLine(task1.Status.ToString());Console.WriteLine(task2.Status.ToString());}}catch (AggregateException ex){foreach (Exception innerEx in ex.InnerExceptions){Console.WriteLine(innerEx.ToString());}} 28. Retornando valores desde las tareasstatic List GenerateSomethingReturn(){Console.WriteLine("GenerateSomething");Thread.Sleep(3000);return new List{"Estoy","retornando","una","lista","de","strings."};}var task1 = Task.Factory.StartNew(() => GenerateSomethingReturn());try{task1.Wait();}catch (AggregateException ex){foreach (Exception innerEx in ex.InnerExceptions){Console.WriteLine(innerEx.ToString());}}var task2 = Task.Factory.StartNew(() =>{foreach (var result in task1.Result){Console.WriteLine(result);}}); 29. Cancelando Tareas usando TokensCancellationToken cancellationTokenCancellationTokenSourceSe pasa como parmetroControla la cancelacin desde el mtodo principalstatic void GenerateSomethingCancel(CancellationToken cancellationToken){cancellationToken.ThrowIfCancellationRequested();Console.WriteLine("GenerateSomething");Thread.Sleep(3000);cancellationToken.ThrowIfCancellatio