Как связаны друг с другом Reactive Framework, PLINQ, TPL и Параллельные расширения?

StackOverflow https://stackoverflow.com/questions/2138361

Вопрос

По крайней мере, с момента выпуска .NET 4.0 Microsoft, похоже, приложила много усилий для поддержки параллельного и асинхронного программирования, и, похоже, появилось множество API и библиотек для этого.Особенно в последнее время повсюду постоянно упоминаются следующие причудливые названия:

  • Реактивный Фреймворк,
  • PLINQ (Параллельный LINQ),
  • TPL (библиотека параллельных задач) и
  • Параллельные расширения.

Теперь все они, похоже, являются продуктами Microsoft, и все они, похоже, нацелены на сценарии асинхронного или параллельного программирования для .NET.Но не совсем ясно, что такое каждый из них на самом деле и как они связаны друг с другом.Некоторые из них на самом деле могут быть одним и тем же.

В нескольких словах, может ли кто-нибудь прояснить, что есть что?

Это было полезно?

Решение

ПЛИНК (Parallel Linq) - это просто новый способ написания обычных запросов Linq, чтобы они выполнялись параллельно - другими словами, фреймворк автоматически позаботится о выполнении вашего запроса в нескольких потоках, чтобы они завершались быстрее (т.Е.используя несколько ядер процессора).

Например, предположим, что у вас есть куча строк, и вы хотите получить все те, которые начинаются на букву "А".Вы могли бы написать свой запрос следующим образом:

var words = new[] { "Apple", "Banana", "Coconut", "Anvil" };
var myWords = words.Select(s => s.StartsWith("A"));

И это прекрасно работает.Однако, если у вас было 50 000 слов для поиска, вы могли бы воспользоваться преимуществом того факта, что каждый тест независим, и разделить его на несколько ядер:

var myWords = words.AsParallel().Select(s => s.StartsWith("A"));

Это все, что вам нужно сделать, чтобы превратить обычный запрос в параллельный, который выполняется на нескольких ядрах.Довольно аккуратно.


Тот Самый TPL (Task Parallel Library) является своего рода дополнением к PLINQ, и вместе они составляют параллельные расширения.Принимая во внимание, что PLINQ в значительной степени основан на функциональный стиль программирования с НЕТ побочные эффекты, побочные эффекты - это именно то, для чего предназначен TPL.Если ты действительно хочешь выполняйте работу параллельно в отличие от простого поиска / выбора объектов параллельно, вы используете TPL.

TPL - это, по сути, Parallel класс, который подвергает перегрузкам For, Foreach, и Invoke. Invoke это немного похоже на постановку задач в очередь в ThreadPool, но немного проще в использовании.ИМО, чем интереснее фрагменты, тем For и Foreach.Итак, например, предположим, что у вас есть целая куча файлов, которые вы хотите сжать.Вы могли бы написать обычную последовательную версию:

string[] fileNames = (...);
foreach (string fileName in fileNames)
{
    byte[] data = File.ReadAllBytes(fileName);
    byte[] compressedData = Compress(data);
    string outputFileName = Path.ChangeExtension(fileName, ".zip");
    File.WriteAllBytes(outputFileName, compressedData);
}

Опять же, каждая итерация этого сжатия полностью независима от любой другой.Мы можем ускорить это, выполнив несколько из них одновременно:

Parallel.ForEach(fileNames, fileName =>
{
    byte[] data = File.ReadAllBytes(fileName);
    byte[] compressedData = Compress(data);
    string outputFileName = Path.ChangeExtension(fileName, ".zip");
    File.WriteAllBytes(outputFileName, compressedData);
});

И опять же, это все, что требуется для распараллеливания этой операции.Теперь, когда мы запускаем наш CompressFiles метод (или как бы мы ни решили его назвать), он будет использовать несколько ядер процессора и, вероятно, завершится в половине или 1/4 раза быстрее.

Преимущество этого перед тем, как просто выбросить все это в ThreadPool это что, на самом деле работает синхронно.Если вы использовали ThreadPool вместо этого (или просто Thread экземпляры), вам пришлось бы придумать способ узнать, когда все задачи будут завершены, и пока это не ужасно сложно сказать, это то, с чем многие люди склонны облажаться или, по крайней мере, испытывают проблемы.Когда вы используете Parallel класс, на самом деле тебе не нужно об этом думать;аспект многопоточности скрыт от вас, все это обрабатывается за кулисами.


Реактивные Расширения (Rx) на самом деле совершенно другой зверь.Это другой способ думать об обработке событий.По этому вопросу действительно много материала, но, короче говоря, вместо того, чтобы привязывать обработчики событий к событиям, Rx позволяет обрабатывать последовательности событий как...ну, последовательности (IEnumerable<T>).Вы можете обрабатывать события итеративным способом вместо того, чтобы запускать их асинхронно в случайные моменты времени, когда вам приходится постоянно сохранять состояние, чтобы обнаружить серию событий, происходящих в определенном порядке.

Один из самых крутых примеров, которые я нашел в Rx, - это здесь.Перейдите к разделу "Linq to IObservable", где он реализует обработчик перетаскивания, который обычно является проблемой в WPF, всего в 4 строках кода.Rx дает вам состав событий, чего у вас на самом деле нет в обычных обработчиках событий, и фрагменты кода, подобные этим, также легко реорганизуются в поведенческие классы, которые вы можете использовать в любом месте.


И это все.Это некоторые из самых интересных функций, доступных в .NET 4.0.Конечно, есть еще несколько, но это были те, о которых вы спрашивали!

Другие советы

Мне нравится ответ Ааронота, но я бы сказал, что Rx и TPL решают разные проблемы.Частью того, что добавила команда TPL, являются примитивы потоков и значительные улучшения в строительных блоках среды выполнения, таких как ThreadPool.И все, что вы перечисляете, построено на основе этих примитивов и функций среды выполнения.

Но TPL и Rx решают две разные проблемы.TPL работает лучше всего, когда программа или алгоритм «вытягивает и ставит в очередь».Rx превосходен, когда программе или алгоритму необходимо «реагировать» на данные из потока (например, ввод с помощью мыши или при получении потока связанных сообщений от конечной точки, такой как WCF).

Вам понадобится концепция «единицы работы» из TPL, чтобы выполнять работу, подобную файловой системе, перебирать коллекцию или перемещаться по иерархии, например, по организационной диаграмме.В каждом из этих случаев программист может рассуждать об общем объеме работы, работа может быть разбита на куски определенного размера (задачи), а в случае выполнения вычислений по иерархии задачи могут быть «связаны» вместе. .Таким образом, определенные типы работ поддаются модели TPL «Иерархия задач» и получают выгоду от усовершенствований сантехники, таких как отмена (см. видео Channel 9 на CancellationTokenSource).TPL также имеет множество регуляторов для специализированных областей, таких как обработка данных в режиме, близком к реальному времени.

Rx будет тем, что в конечном итоге следует использовать большинству разработчиков.Именно так приложения WPF могут «реагировать» на внешние сообщения, такие как внешние данные (поток IM-сообщений клиенту IM) или внешний ввод (например, пример перетаскивания мышью, связанный с Aaronaught).Под прикрытием Rx использует потоковые примитивы из TPL/BCL, потокобезопасные коллекции из TPL/BCL и объекты времени выполнения, такие как ThreadPool.На мой взгляд, Rx — это «самый высокий уровень» программирования для выражения ваших намерений.

Сможет ли среднестатистический разработчик осознать набор намерений, которые вы можете выразить с помощью Rx, еще неизвестно.:)

Но я думаю, что в ближайшие пару лет TPL vs.Rx станет следующей дискуссией, такой как LINQ-to-SQL или LINQ-to-SQL.Структура сущности.В одной области существует два варианта API, которые специализированы для разных сценариев, но во многом пересекаются.Но в случае TPL и Rx они на самом деле знают друг о друге, и существуют встроенные адаптеры для составления приложений и совместного использования обеих платформ (например, передача результатов из цикла PLINQ в поток IObservable Rx).Людям, которые не занимались параллельным программированием, предстоит многому научиться, чтобы освоиться.

Обновлять:Я использую как TPL, так и RxNet в своей обычной работе последние 6 месяцев (из 18 месяцев с момента моего первоначального ответа).Мои мысли о выборе TPL и/или RxNet в службе WCF среднего уровня (корпоративная служба LOB): http://yzorgsoft.blogspot.com/2011/09/middle-tier-tpl-andor-rxnet.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top