![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Параллелизм при декларативной обработке данных
PLINQ (Parallel Language Integrated Query) – реализация LINQ, в которой запросы выполняются параллельно. PLINQ поддерживает большинство операторов LINQ to Objects и имеет минимальное влияние на существующую модель LINQ. Начнём рассмотрение PLINQ со следующего примера. Найдём все простые числа от 3 до 100000, используя простой алгоритм с операторами LINQ: var numbers = Enumerable.Range(3, 100000 - 3); var parallelQuery = from n in numbers.AsParallel() where Enumerable.Range(2, (int) Math.Sqrt(n)).All(i => n%i > 0) select n; var primes = parallelQuery.ToArray(); В приведённом фрагменте кода использовался метод AsParallel(). Это метод расширения из статического класса System.Linq.ParallelEnumerable. Метод AsParallel() конвертирует коллекцию IEnumerable< T> в коллекцию ParallelQuery< T>. Класс ParallelEnumerable имеет набор методов расширения для ParallelQuery< T>, соответствующих операторам LINQ, но использующих для выполнения механизм задач. Кроме AsParallel(), класс ParallelEnumerable содержит ещё несколько особых методов: 1. AsSequential() – конвертирует объект ParallelQuery< T> в коллекцию IEnumerable< T> так, что все запросы выполняются последовательно. 2. AsOrdered() – при параллельной обработке заставляет сохранять в ParallelQuery< T> порядок элементов (это замедляет обработку). 3. AsUnordered() – при параллельной обработке позволяет игнорировать в ParallelQuery< T> порядок элементов (отмена вызова AsOrdered()). 4. WithCancellation() – устанавливает для ParallelQuery< T> указанное значение токена отмены. 5. WithDegreeOfParallelism() – указывает для ParallelQuery< T>, на сколько параллельных частей нужно разбивать коллекцию для обработки. 6. WithExecutionMode() – задаёт опции выполнения параллельных запросов в виде перечисления ParallelExecutionMode. Приведём ещё один пример использования PLINQ. Будем вычислять времени отклика от шести заданных сайтов. При этом явно установим степень параллелизма. В примере используется класс Ping из пространства имён System.Net.NetworkInformation. var siteNames = new[] {" www.tut.by", " habrahabr.ru", " www.oreilly.com", " www.google.com", " www.takeonit.com", " stackoverflow.com" };
var pings = from site in siteNames.AsParallel() .WithDegreeOfParallelism(6) let p = new Ping().Send(site) select new {site, Time = p.RoundtripTime};
foreach (var ping in pings) { Console.WriteLine(" Site {0} has ping {1}", ping.site, ping.Time); }
|