Presentation_1369080393540

46
СЕКРЕТЫ МНОГОПОТОЧНОСТИ .NET Елисеев Сергей Санкт-Петербург, СКАУТ 2013

Transcript of Presentation_1369080393540

Page 1: Presentation_1369080393540

СЕКРЕТЫ МНОГОПОТОЧНОСТИ .NET

Елисеев Сергей

Санкт-Петербург, СКАУТ

2013

Page 2: Presentation_1369080393540

Agenda

Потоки Windows vs потоки CLR

Почему не потоки

Таски

Особенности TrheadPool

Предположения .NET о ваших тасках

Пример – 100 тасок.

PLINQ vs PARALLEL.FOR(EACH)

Cancelling.

Exception handling.

Page 3: Presentation_1369080393540

Потоки Windows и потоки CLR

Сейчас одно и то же. Но были попытки сделать потоки CLR на нитях.

Page 4: Presentation_1369080393540

Почему не потоки?

Поток – тяжелый объект. Затраты на переключение контекста.Занимает много памяти по умолчанию. 1 мбДля каждого потока необходимо писать свой код обработки исключений.

Выход: пользоваться пулом потоков .NET

Page 5: Presentation_1369080393540

TASKS TASKS TASKS

Наша задача выражать работу в тасках.Задача .net выполнять таски правильно.

Page 6: Presentation_1369080393540

Почему не ThreadPool?

Не предоставляет удобного способа обработки исключений

По факту – устарел

НО: Task – это обертка над ThreadPool, которая расходует память.

Page 7: Presentation_1369080393540

Как правильно создавать TASK• Task.Factory.StartNew();

• Vs

• new Task(…).Start()

Page 8: Presentation_1369080393540

Как правильно создавать TASK• Task.Factory.StartNew(); - WINNER!!!

• Vs

• new Task(…).Start()• - необходимы затраты на синхронизацию• Причина необходимости – проверить, что START

вызывается только один раз.

Page 9: Presentation_1369080393540

Task Granularity?

Page 10: Presentation_1369080393540
Page 11: Presentation_1369080393540
Page 12: Presentation_1369080393540
Page 13: Presentation_1369080393540
Page 14: Presentation_1369080393540
Page 15: Presentation_1369080393540

Конфигурирование ThreadPool• SETMAXTHREAD

• SETMINTHREAD

Page 16: Presentation_1369080393540

Предположение .net о ваших тасках.

• Таск маленький. 1-2 секунды• Выполнение может идти в любом порядке.

Page 17: Presentation_1369080393540
Page 18: Presentation_1369080393540
Page 19: Presentation_1369080393540
Page 20: Presentation_1369080393540
Page 21: Presentation_1369080393540
Page 22: Presentation_1369080393540

Решение

Создать несколько Tasks.

Когда одна заканчивается запускать новую.

Page 23: Presentation_1369080393540
Page 24: Presentation_1369080393540
Page 25: Presentation_1369080393540

Перегрузки Parralel.For/Foreach

public class ParallelOptions{public ParallelOptions();

public CancellationToken CancellationToken { get; set; } // Default=CancellationToken.None

public Int32 MaxDegreeOfParallelism { get; set; } // Default=-1 (# of available CPUs)

public TaskScheduler TaskScheduler { get; set; } // Default=TaskScheduler.Default}

Page 26: Presentation_1369080393540

LINQ

• Where, Select, SelectMany, GroupBy, Join, OrderBy,• Skip, Take – все это можно выполнить в нескольких

потоках.

Page 27: Presentation_1369080393540

AsParallel

var query =

from type in assembly.GetExportedTypes().AsParallel()

orderby type.FullName

let obsoleteAttrObj = (ObsoleteAttribute)

Attribute.GetCustomAttribute(method, obsoleteAttrType)

select …

// Display the results

foreach (var result in query) Console.WriteLine(result);

Page 28: Presentation_1369080393540

ForAll

// Display the resultsquery.ForAll(Console.WriteLine);

Page 29: Presentation_1369080393540

AsSequential

AsOrdered (AsUnordered)

Unordored Operations:Distinct, Except, Intersect, Union, Join, GroupBy, GroupJoin, and ToLookup.

Ordored Operations: OrderBy, OrderByDescending, ThenBy,and ThenByDescending.

Скорее всего, будет эффективнее выполнить последовательно Concat, ElementAt(OrDefault), First(OrDefault), Last(OrDefault), Skip(While), Take(While),or Zip.

Page 30: Presentation_1369080393540

Методы расширения

WithCancellation(CancellationTokencancellationToken)

WithDegreeOfParallelism (Int32degreeOfParallelism)WithExecutionMode(ParallelExecutionModeexecutionMode)

И др.

Page 31: Presentation_1369080393540

Plinq vs Parallel.For(each)• Если у нас простой независимый перебор по

элементам с выполнением операции то выбираем Parralel.For

Page 32: Presentation_1369080393540

Plinq vs Parallel.For(each)• Если необходимо сохранить порядок, то лучше

использовать Plinq• var ProcessedMovie = • Movie • .AsParallel() • .AsOrdered() • .Select(frame => ConvertToGrayscale(frame));

Page 33: Presentation_1369080393540

Plinq vs Parallel.For(each)

Если обработка с выборкой – PLINQ

PLINQ

Page 34: Presentation_1369080393540

Plinq vs Parallel.For(each) Parralel.For

Page 35: Presentation_1369080393540

Plinq vs Parallel.For(each). Обаботка двух коллекций.

PLINQ Winner

PLINQ

Page 36: Presentation_1369080393540

Plinq vs Parallel.For(each). Обаботка двух коллекций.

PLINQ Winner

Parralel.For

Page 37: Presentation_1369080393540

Plinq vs Parallel.For(each). Поиск до первого совпадения.

Parallel.For - WIN

Parralel.For

Page 38: Presentation_1369080393540

Timers• Когда: Когда необходимо выполнять задачу

периодически.

• В таймере можно получать сообщение о том что таска упала, и можно перезапускать ее.

Page 39: Presentation_1369080393540

Обработка исключений

C thread было все плохо

Page 40: Presentation_1369080393540

Обработка исключений// Start a Task that throws a NullReferenceException:Task task = Task.Run (() => { throw null; });try{

task.Wait();}catch (AggregateException aex){

if (aex.InnerException is ullReferenceException)Console.WriteLine ("Null!");

elsethrow;

}

Page 41: Presentation_1369080393540

Что, если создали Task, и забыли.

Если она упала, то:1) Когда она будет уничтожаться сборщиком мусора поток финализатора пробросит исключение

Если мы ожидали таску с таймаутом, то все исключения которые она бросила после истечения таймаута считаются непоймаными.

Если обратиться к полю Exception у таска, то все непойманные исключения пометятся станут пойманными.

Page 42: Presentation_1369080393540
Page 43: Presentation_1369080393540

Cancelling

Page 44: Presentation_1369080393540

Cancelling

Page 45: Presentation_1369080393540

Спасибо за внимание!

Page 46: Presentation_1369080393540

Почему DEAD LOCK – 100%?