Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Параллелизм при декларативной обработке данных






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);

}






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.