Доступные параллельные технологии в .NET

Я плохо знаком с платформой .NET. Я сделал поиск и нашел, что существует несколько способов сделать параллельные вычисления в .NET:

  1. Параллельная задача в Библиотеке Параллели Задачи, которая является.Net 3.5.

  2. PLINQ.Net 4.0

  3. Программирование Asynchounous.Net 2.0, (асинхронный главным образом используется, чтобы сделать ввод-вывод тяжелые задачи, F#, имеют краткий синтаксис, поддерживающий это). Я перечисляю это, потому что в Моно, кажется, нет никакого TPL или PLINQ. Таким образом, если я должен записать кросс-платформенные параллельные программы, я могу использовать асинхронный.

  4. Потоки .NET. Никакое ограничение версии.

Вы могли дать некоторые короткие комментарии к ним или добавить больше методов в этом списке?

11
задан Cœur 24 September 2018 в 15:09
поделиться

6 ответов

Вам действительно нужно провести изрядное исследование, чтобы определить, как эффективно использовать многопоточность. Есть несколько хороших технических статей , которые являются частью сайта группы Microsoft Parallel Computing .

Я не понимаю, что есть несколько способов реализовать многопоточность:

  1. Класс Thread .
  2. ThreadPool , который также поддерживает операции с привязкой к вводу-выводу и порт завершения ввода-вывода.
  3. Начать * / Конец * асинхронных операций.
  4. Компоненты асинхронного программирования на основе событий (или «EBAP»), которые используют SynchronizationContext .
  5. BackgroundWorker - протокол EBAP, определяющий асинхронную операцию.
  6. Класс задачи (библиотека параллельных задач) в .NET 4.
  7. Параллельный LINQ. Есть хорошая статья о Parallel.ForEach (Task Parallel Library) и PLINQ.
  8. Rx или «LINQ to Events», который еще не имеет небета-версии, но близится к завершению и выглядит многообещающим.
  9. (только F #) Асинхронные рабочие процессы.

Обновление: есть статья Понимание и применение параллельных шаблонов с .NET Framework 4 , доступная для загрузки, которая дает некоторые указания, какие решения использовать для каких типов параллельных сценариев (хотя предполагается, что .NET 4 и не покрывает Rx).

15
ответ дан 3 December 2019 в 02:01
поделиться

Еще одна новая параллель задач. библиотека в .NET 4.0, которая похожа и соответствует тому, что вы уже обнаружили, но это может быть интересное чтение:

Task Parallel Library

2
ответ дан 3 December 2019 в 02:01
поделиться

Также есть Реактивные расширения для .NET (Rx)

Rx - это в основном запросы linq для событий. Он позволяет обрабатывать и комбинировать асинхронные потоки данных так же, как linq позволяет работать с коллекциями. Таким образом, вы, вероятно, использовали бы его в сочетании с другими параллельными технологиями как способ объединения результатов ваших параллельных операций, не беспокоясь о блокировках и других примитивах потоковой передачи низкого уровня.

От эксперта к эксперту: Брайан Бекман и Эрик Мейер - Внутри .NET Reactive Framework (Rx) дает хорошее представление о том, что такое Rx.

РЕДАКТИРОВАТЬ: Еще одна заслуживающая упоминания библиотека - это Concurrency and Coordination Runtime (CCR), она существует уже давно (до '06) и поставляется как часть Microsoft Robotics Studio ].

В Rx есть много тех же интересных идей, что и в CCR, но, на мой взгляд, с гораздо более приятным API. В CCR все еще есть кое-что интересное, так что, возможно, стоит проверить. Также существует структура распределенных сервисов, которая работает с CCR, что может сделать ее полезной в зависимости от того, что вы делаете.

От эксперта к эксперту: Мейер и Хризантакопулос - Параллелизм, координация и CCR

3
ответ дан 3 December 2019 в 02:01
поделиться

Два основных способа выполнения параллельных операций - это потоки и новая библиотека на основе задач TPL.

Асинхронное программирование, о котором вы говорите, - это не что иное, как один новый поток в пуле потоков.

PLINQ, Rx и другие упомянутые на самом деле расширения, расположенные в верхней части нового планировщика задач.

лучшая статья, объясняющая именно новую архитектуру для нового планировщика задач и всех библиотек на его вершине, Visual Studio 2010 и новый параллелизм на основе задач TPL .NET 4.0, находится здесь (Стив Тейшейра, менеджер подразделения продукта для параллельных разработчиков Инструменты в Microsoft):

http://www.drdobbs.com/visualstudio/224400670

в противном случае доктор Доббс выделил здесь секцию параллельного программирования: http://www.drdobbs.com/go-parallel /index.jhtml

Основное различие между упомянутыми потоками и параллельным программированием на основе новых задач заключается в том, что вам больше не нужно думать в терминах потоков, как вы больше управляете пулами, базовой ОС и оборудованием. TPL позаботится о том, чтобы вы просто использовали задачи. Это огромное изменение в способах параллельной работы на любом уровне, включая абстракцию.

Итак, в .NET на самом деле у вас не так много вариантов:

  1. Thread
  2. Новый планировщик задач, основанный на задачах.

Очевидно, что основанный на задаче путь - это путь.

ура Валко

-1
ответ дан 3 December 2019 в 02:01
поделиться

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

Параллельный означает, что "задача" разбивается на несколько более мелких подзадач, которые могут выполняться одновременно. Для этого требуется многоядерный процессор или компьютер с несколькими процессорами, где каждая задача имеет свое выделенное ядро или процессор. Или несколько компьютеров. PLINQ (параллелизм данных) и TPL (параллелизм задач) относятся к этой категории.

Асинхронный означает, что задачи выполняются, не блокируя друг друга. Выражение async в F#, Rx, паттерн Begin/End - все это API для асинхронного программирования.

Параллелизм - понятие более широкое, чем параллелизация и асинхронность. Параллелизм означает, что несколько "задач" выполняются в одно и то же время, взаимодействуя друг с другом. Но эти "задачи" не обязательно должны выполняться на отдельных физических вычислительных блоках, как это подразумевается при распараллеливании. Например, многозадачные операционные системы могут выполнять несколько процессов одновременно даже на одноядерных компьютерах с одним процессором, используя временные срезы. Параллельность может быть достигнута, например, с помощью модели Actor и передачи сообщений (например, почтовый ящик в F#, процессы Erlang (Retlang в .Net))

Потоки - это относительно низкоуровневая концепция по сравнению с вышеперечисленными концепциями. Потоки - это задачи, выполняемые внутри процесса, работающие параллельно и управляемые непосредственно планировщиком операционной системы. Вы можете реализовать параллелизацию, когда операционная система сопоставляет каждый поток с отдельным ядром, или акторную модель, реализуя очередь сообщений, маршрутизацию и т.д. на каждом потоке.

12
ответ дан 3 December 2019 в 02:01
поделиться

Существуют также некоторые библиотеки .NET для параллельного программирования данных, предназначенные для графического процессора (GPU), включая:

Microsoft Accelerator предназначен для параллельного программирования данных и может работать как с графическим процессором, так и с многоядерными процессорами.

Brama предназначена для преобразований данных в стиле LINQ, которые выполняются на графическом процессоре.

CUDA.NET предоставляет оболочку, позволяющую использовать CUDA из программ .NET.

4
ответ дан 3 December 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: