Как сформулировать разницу между асинхронным и параллельным программированием? - PullRequest
116 голосов
/ 26 мая 2011

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

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

Но я чувствую, что их легко сопоставить, особенно на уровне языкового дизайна.Хотелось бы получить четкое описание того, как они связаны (или нет), и классов программ, в которых каждая из них лучше всего применяется.

Ответы [ 13 ]

79 голосов
/ 26 мая 2011

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

Возьмите, например, рендеринг кадров 3D-анимации.На рендеринг анимации уходит много времени, поэтому, если бы вы запустили этот рендеринг из своего программного обеспечения для редактирования анимации, вы должны убедиться, что оно работает асинхронно , чтобы оно не блокировало ваш пользовательский интерфейс, и вы могли бы продолжить делатьдругие вещи.Теперь каждый кадр этой анимации также можно рассматривать как отдельную задачу.Если у нас есть несколько процессоров / ядер или несколько машин, мы можем визуализировать несколько кадров в параллельно , чтобы ускорить общую рабочую нагрузку.

60 голосов
/ 21 июля 2013

Я полагаю, что основное различие между параллелизмом и параллелизмом .

Асинхронным и Обратными вызовами обычно являютсяспособ (инструмент или механизм) для выражения параллелизма, т. е. набор сущностей, которые могут общаться друг с другом и совместно использовать ресурсы.В случае асинхронного или обратного вызова связь подразумевается, в то время как совместное использование ресурсов является необязательным (рассмотрим RMI, где результаты вычисляются на удаленном компьютере).Как правильно отмечено, это обычно делается с учетом оперативности;не ждать длинных событий latency .

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

Чтобы лучше понять различие между параллелизмом и параллелизмом, я собираюсь процитировать из Вероятностные модели для параллелизма Даниэля Варакки, которая является хорошим набором заметок для теории параллелизма:

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

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

Async и Callbacks - это всего лишь механизм, который позволяет программисту выражать параллелизм.Учтите, что хорошо известные шаблоны проектирования параллельного программирования, такие как master / worker или map / lower, реализуются средами, в которых используются такие механизмы более низкого уровня (асинхронные) для реализации более сложных централизованных взаимодействий.

32 голосов
/ 26 мая 2011

Эта статья очень хорошо объясняет это: http://urda.cc/blog/2010/10/04/asynchronous-versus-parallel-programming

В нем содержится информация об асинхронном программировании:

Асинхронные вызовы используются для предотвращения «блокировки» в приложении.[Такой] вызов будет выделяться в уже существующем потоке (таком как поток ввода-вывода) и будет выполнять свою задачу, когда сможет.

это о параллельном программировании:

В параллельном программировании вы все еще разбиваете работу или задачи, но ключевое отличие состоит в том, что вы раскручиваете новые потоки для каждого куска работы

и это в итоге:

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

17 голосов
/ 26 мая 2011

Мое базовое понимание:

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

Параллельное программирование связано, но больше касается разбиения большой задачи на более мелкие куски, которые могут быть вычислены одновременно. Результаты меньших порций затем могут быть объединены для получения общего результата. Пример: трассировка лучей, когда цвет отдельных пикселей практически не зависит.

Возможно, это сложнее, но я думаю, что это основное различие.

13 голосов
/ 28 февраля 2016

async : Сделайте это самим где-нибудь еще и сообщите мне, когда завершите (обратный вызов). К тому времени я смогу продолжать делать свое дело.

enter image description here

параллельно : Нанимайте столько парней (потоков), сколько пожелаете и делите им задания, чтобы завершить быстрее и дайте мне знать (обратный вызов), когда Вы завершили. К тому времени, когда я смогу продолжить делать другие мои вещи.

enter image description here

Основное отличие заключается в том, что параллелизм в основном зависит от аппаратного обеспечения.

13 голосов
/ 24 ноября 2012

Я склонен думать о разнице в этих терминах:

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

Параллельно: я хочу, чтобы вы выполнили эту задачу.Если это облегчает, попросите некоторых помочь.Это срочно, поэтому я подожду здесь, пока вы не вернетесь с результатами.Я ничего не могу поделать, пока ты не вернешься.

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

11 голосов
/ 24 ноября 2012

Речь идет о порядке исполнения.

Если A асинхронен с B, то я не могу заранее предсказать, когда произойдут части A относительно частей B.

Если A параллельна B, то вещи в A происходят одновременно с вещами в B. Однако порядок выполнения все же может быть определен.

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

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

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

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

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

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

Ружье Гатлинга можно считать параллельным, но все на 100% синхронно, так что, как будто один процесс движется вперед.

8 голосов
/ 08 октября 2014

Почему асинхронный?

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

Почему параллельное программирование?

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

4 голосов
/ 24 июля 2014

Я пришел сюда довольно комфортно с этими двумя понятиями, но с чем-то неясным для меня о них.

Прочитав некоторые ответы, я думаю, что у меня есть правильная и полезная метафора, чтобы описать разницу.

Если вы рассматриваете свои отдельные строки кода как отдельные, но упорядоченные игральные карты (остановите меня, если я объясню, как работают перфокарты старой школы), то для каждой отдельной написанной процедуры у вас будет уникальная стопка карт ( не копируйте и не вставляйте!) и разница между тем, что обычно происходит, когда код выполняется нормально и асинхронно, зависит от того, заботитесь вы об этом или нет.

Когда вы запускаете код, вы передаете ОС набор отдельных операций (на которые ваш компилятор или интерпретатор разбил ваш код «более высокого» уровня) для передачи процессору. С одним процессором, только одна строка кода может быть выполнена в любой момент времени. Таким образом, чтобы создать иллюзию одновременного запуска нескольких процессов, ОС использует технику, в которой она отправляет процессору только несколько строк из заданного процесса за раз, переключаясь между всеми процессами в соответствии с тем, как она видит. поместиться. В результате несколько процессов показывают прогресс конечному пользователю в одно и то же время.

Для нашей метафоры связь такова, что ОС всегда перетасовывает карты перед отправкой их в процессор. Если ваш стек карт не зависит от другого стека, вы не заметите, что ваш стек перестал выбираться, когда другой стек стал активным. Так что, если вам все равно, это не имеет значения.

Однако, если вам все равно (например, есть несколько процессов - или стопок карт - которые зависят друг от друга), то перетасовка ОС испортит ваши результаты.

Написание асинхронного кода требует обработки зависимостей между порядком выполнения независимо от того, чем в конечном итоге является этот порядок. Вот почему используются такие конструкции, как «обратные вызовы». Они говорят процессору: «Следующее, что нужно сделать, это рассказать другому стеку, что мы сделали». Используя такие инструменты, вы можете быть уверены, что другой стек получит уведомление, прежде чем он позволит ОС выполнить больше своих инструкций. («Если call_back == false: send (no_operation)» - не уверен, действительно ли это так, как это реализовано, но логически я думаю, что это согласованно.)

Для параллельных процессов разница в том, что у вас есть два стека, которые не заботятся друг о друге, и два рабочих для их обработки. В конце дня вам может понадобиться объединить результаты из двух стеков, что в свою очередь станет вопросом синхронности, но для выполнения вам снова все равно.

Не уверен, поможет ли это, но я всегда нахожу несколько полезных объяснений. Также обратите внимание, что асинхронное выполнение не ограничено отдельным компьютером и его процессорами. Вообще говоря, он имеет дело со временем или (в более общем смысле) порядком событий. Поэтому, если вы отправляете зависимый стек A на сетевой узел X, а его связанный стек B - на Y, правильный асинхронный код должен учитывать ситуацию, как если бы он выполнялся локально на вашем ноутбуке.

4 голосов
/ 13 мая 2014

Асинхронный: запуск метода или задачи в фоновом режиме, без блокировки.Может не обязательно работать в отдельном потоке.Использует переключение контекста / планирование времени.

Параллельные задачи: каждая задача выполняется параллельно.Не использует переключение контекста / планирование времени.

...