Как сформулировать разницу между асинхронным и параллельным программированием?

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

Я программист и часто использую async и callback. parallelism чувствует себя экзотическим.

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

Он имеет это о асинхронном программировании:

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

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

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

и это вкратце:

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

Ответ 4

Мое основное понимание:

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

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

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

Ответ 5

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

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

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

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

Ответ 6

Это вопрос порядка исполнения.

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

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

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

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

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

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

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

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

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

Ответ 7

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

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

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

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

Ответ 8

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

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

Ответ 9

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

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

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

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

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

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

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

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

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

Ответ 10

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

введите описание изображения здесь

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

введите описание изображения здесь

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