Presentation_1369080393540
-
Upload
alexander-nevidimov -
Category
Documents
-
view
108 -
download
0
Transcript of Presentation_1369080393540
СЕКРЕТЫ МНОГОПОТОЧНОСТИ .NET
Елисеев Сергей
Санкт-Петербург, СКАУТ
2013
Agenda
Потоки Windows vs потоки CLR
Почему не потоки
Таски
Особенности TrheadPool
Предположения .NET о ваших тасках
Пример – 100 тасок.
PLINQ vs PARALLEL.FOR(EACH)
Cancelling.
Exception handling.
Потоки Windows и потоки CLR
Сейчас одно и то же. Но были попытки сделать потоки CLR на нитях.
Почему не потоки?
Поток – тяжелый объект. Затраты на переключение контекста.Занимает много памяти по умолчанию. 1 мбДля каждого потока необходимо писать свой код обработки исключений.
Выход: пользоваться пулом потоков .NET
TASKS TASKS TASKS
Наша задача выражать работу в тасках.Задача .net выполнять таски правильно.
Почему не ThreadPool?
Не предоставляет удобного способа обработки исключений
По факту – устарел
НО: Task – это обертка над ThreadPool, которая расходует память.
Как правильно создавать TASK• Task.Factory.StartNew();
• Vs
• new Task(…).Start()
Как правильно создавать TASK• Task.Factory.StartNew(); - WINNER!!!
• Vs
• new Task(…).Start()• - необходимы затраты на синхронизацию• Причина необходимости – проверить, что START
вызывается только один раз.
Task Granularity?
Конфигурирование ThreadPool• SETMAXTHREAD
• SETMINTHREAD
Предположение .net о ваших тасках.
• Таск маленький. 1-2 секунды• Выполнение может идти в любом порядке.
Решение
Создать несколько Tasks.
Когда одна заканчивается запускать новую.
Перегрузки 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}
LINQ
• Where, Select, SelectMany, GroupBy, Join, OrderBy,• Skip, Take – все это можно выполнить в нескольких
потоках.
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);
ForAll
// Display the resultsquery.ForAll(Console.WriteLine);
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.
Методы расширения
WithCancellation(CancellationTokencancellationToken)
WithDegreeOfParallelism (Int32degreeOfParallelism)WithExecutionMode(ParallelExecutionModeexecutionMode)
И др.
Plinq vs Parallel.For(each)• Если у нас простой независимый перебор по
элементам с выполнением операции то выбираем Parralel.For
•
Plinq vs Parallel.For(each)• Если необходимо сохранить порядок, то лучше
использовать Plinq• var ProcessedMovie = • Movie • .AsParallel() • .AsOrdered() • .Select(frame => ConvertToGrayscale(frame));
Plinq vs Parallel.For(each)
Если обработка с выборкой – PLINQ
PLINQ
Plinq vs Parallel.For(each) Parralel.For
Plinq vs Parallel.For(each). Обаботка двух коллекций.
PLINQ Winner
PLINQ
Plinq vs Parallel.For(each). Обаботка двух коллекций.
PLINQ Winner
Parralel.For
Plinq vs Parallel.For(each). Поиск до первого совпадения.
Parallel.For - WIN
Parralel.For
Timers• Когда: Когда необходимо выполнять задачу
периодически.
• В таймере можно получать сообщение о том что таска упала, и можно перезапускать ее.
Обработка исключений
C thread было все плохо
Обработка исключений// 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;
}
Что, если создали Task, и забыли.
Если она упала, то:1) Когда она будет уничтожаться сборщиком мусора поток финализатора пробросит исключение
Если мы ожидали таску с таймаутом, то все исключения которые она бросила после истечения таймаута считаются непоймаными.
Если обратиться к полю Exception у таска, то все непойманные исключения пометятся станут пойманными.
Cancelling
Cancelling
Спасибо за внимание!
Почему DEAD LOCK – 100%?