В чем разница между параллелизмом, параллелизмом и асинхронными методами?

178

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

Каковы различия между этими 3 понятиями?

GurdeepS
источник
8
Термин «асинхронный» может означать много разных вещей. Эти термины связаны, но они не описывают непересекающиеся множества вещей. Значения совпадают и меняются в зависимости от ситуации.
Заостренный
2
Таким образом, первый параллелизм запускает два или более процессов одновременно. С этим вне пути одновременность не параллельна. Параллельные процессы требуют двух или более ядер, тогда как параллельные процессы могут совместно использовать одно ядро.
Рик О'Ши

Ответы:

139

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

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

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

С точки зрения пользователя, это выглядит как многозадачность, но это не так.


РЕДАКТИРОВАТЬ

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

Лазарь
источник
34
Я бы сказал, что в первом абзаце вы перепутали параллелизм и параллелизм. Параллелизм относится к управлению несколькими потоками выполнения, где параллелизм более конкретно - одновременное выполнение нескольких потоков выполнения. Параллелизм - это более широкий термин, который может включать параллелизм.
Марк Х
7
Хотя эти два слова очень похожи и могут быть сбиты с толку (и часто таковыми являются), у них действительно есть разные определения: «Параллельно = существует, происходит или выполняется одновременно». Параллельно = или имеет отношение к кажущемуся или фактическому выполнению более чем одной операции за раз, одним и тем же или разными устройствами. Как вы можете видеть, параллель не обязательно означает одновременность, а может показаться параллельной. В конце дня слова часто используются взаимозаменяемо, и, если n dev - это комната, вы, вероятно, получите n + 1 определений;)
Lazarus
3
@ Mehrdad Если вы собираетесь основывать свои определения словарных слов на их использовании в маркетинговых материалах, то я думаю, что вы, скорее всего, окажетесь в невыгодном положении.
Лазарь
6
Неправильно. В контексте программирования параллелизм - это способность вашего кода «составляться» из кусочков логики, которые могут выполняться одновременно. Параллелизм (в сочетании с параллелизмом) берет указанный код и запускает его на 100-ядерном компьютере.
Фрэнк Радокай
2
@FrankRadocaj это правильно. Параллельная означает, что программа может быть разделена на блоки (блоки, по сути, потоки), которые можно запускать в любом порядке и иметь определенный результат. Параллельно означает, что эти блоки / потоки запускаются буквально одновременно на нескольких процессорах.
89

Коротко,

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

Помните, что параллелизм и параллелизм - это не одно и то же.

Различия между параллелизмом и параллелизмом

Теперь давайте перечислим замечательные различия между параллелизмом и параллелизмом.

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

Параллелизм - это композиция независимо выполняющихся процессов, а параллелизм - это одновременное выполнение (возможно, связанных) вычислений.

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

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

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

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

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

совпадение

Параллельность по существу применима, когда мы говорим о двух или более задачах. Когда приложение способно выполнять две задачи практически одновременно, мы называем это параллельным приложением. Хотя здесь задачи запускаются, похоже, одновременно, но по сути они МОГУТ не быть. Они используют функцию временной синхронизации процессора в операционной системе, где каждая задача выполняет часть своей задачи и затем переходит в состояние ожидания. Когда первая задача находится в состоянии ожидания, ЦП назначается второй задаче для выполнения своей части задачи.

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

параллелизм

Параллелизм не требует двух задач для существования. Он буквально физически выполняет части задач ИЛИ несколько задач, одновременно используя многоядерную инфраструктуру ЦП, назначая одно ядро ​​для каждой задачи или подзадачи.

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

Асинхронные методы

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

Випин Джайн
источник
2
Очень полезно. Спасибо
Неха,
Я все еще не понимаю, как работает Async против параллелизма. Я видел фразу «асинхронный запуск задач» и «одновременный запуск задач». Асинхронное выполнение задач и одновременное выполнение задач означают одно и то же?
Мундра
1
Задача @Moondra Async выполняется в одном потоке, ничего не связанного с многопоточностью. Задача async отправляет задачу внешнему процессу за пределами вашего приложения ... т.е. базе данных, считывателю файлов ... это процессы ввода-вывода, затем в процесс добавляется обратный вызов для выполнения действия после завершения процесса ввода-вывода. в чем я не уверен, так это в том, что в каком-то языке программирования есть некоторые «асинхронные» функции, которые создают отдельную новую нить при вызове асинхронной задачи, я слышал, что C # один, но я не уверен в этом
Тоби Оволави
56

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

Параллелизм - это когда эти задачи фактически выполняются параллельно.

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


Асинхронность - это отдельная концепция (хотя и связана в некоторых контекстах). Это относится к тому факту, что одно событие может происходить в другое время (не синхронно) с другим событием. Приведенные ниже диаграммы иллюстрируют разницу между синхронным и асинхронным выполнением, когда участники могут соответствовать различным потокам, процессам или даже серверам.

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

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

Dimos
источник
6
Простая, эффективная иллюстрация.
contactmatt
1
такое параллелизм такое же как асинхронность?
1
Эти 2 понятия очень близки, но не совпадают. На практике асинхронность больше связана с взаимодействием между действиями (скажем, A & B), когда один (B) запускается другим (A) и будет ли второй ожидать завершения первого. Параллельность - это более общие термины для действий, которые также могут быть не связаны друг с другом, и то, выполняются ли они последовательно или чередуются их выполнения.
Димос
1
Таким образом, асинхронность в основном связана с блокировкой и неблокированием
Даниэль
15

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

Aloysius Snuffleupagus
источник
13

Существует несколько сценариев, в которых может происходить параллелизм:

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

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

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

rahulaga_dev
источник
Это действительно хорошие аналогии! Спасибо. Было бы справедливо сказать, что параллелизм может быть определен вашим многопоточным определением? Таким образом, параллелизм = многопоточность на одноядерном процессоре, который выглядит так, как будто это происходит одновременно, но действительно ли он переключается взад и вперед очень быстро?
Вонгз
3

совпадение

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

параллелизм

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

Параллелизм и параллелизм в деталях

Как видите, параллелизм связан с тем, как приложение обрабатывает несколько задач, над которыми оно работает. Приложение может обрабатывать одну задачу за раз (последовательно) или работать над несколькими задачами одновременно (одновременно).

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

Как видите, приложение может быть параллельным, но не параллельным. Это означает, что он обрабатывает более одной задачи одновременно, но задачи не разбиты на подзадачи.

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

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

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

От http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html

LONGHORN007
источник
3

Параллельно:Это широкий термин, который означает, что два фрагмента кода выполняют это «одновременно». Неважно, является ли это «реальным» параллелизмом или имитируется ли какой-то умный дизайн. Дело в том, что вы можете запускать «задачи» одновременно, а затем управлять ими по отдельности (с помощью мьютекса и всех соответствующих приемов). Но обычно вы предпочитаете использовать слово «параллельный» только для «истинного» параллелизма, например: вы делаете это с помощью не-кооперативной многозадачности (будь то ядра CPU / GPU или только на программном уровне, позволяя ОС управлять им). на очень низком уровне). Люди не хотят говорить «параллельный» только для сложного последовательного кода, который имитирует параллелизм, как, например, вы можете найти в javascript окна браузера. Отсюда причина, по которой люди в этой теме говорят: «асинхронный не имеет ничего общего с параллелизмом». Ну, это так, но не путайте их.

Одновременность: не может быть параллелизма без параллелизма (будь то симулированный или реальный, как я объяснил выше), но этот термин специально фокусируется на том факте, что две системы будут пытаться получить доступ к одному и тому же ресурсу одновременно в какой-то момент. Это подчеркивает тот факт, что вам придется иметь дело с этим.

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

«Асинхронный» относится к представлению параллелизма, которое формализует три основные вещи, обычно используемые в параллелизме: 1) определить инициализацию задачи (скажем, когда она начинается и какие параметры она получает), 2) что должно быть сделано после ее завершения и 3) Что код должен продолжать делать между ними.

Но это все еще только синтаксис (обычно он представляется как методы обратного вызова). За кулисами базовая система может просто решить, что эти так называемые «задачи» - это просто фрагменты кода, которые накапливаются до тех пор, пока не завершит код, который в настоящее время выполняется. И затем он складывает их один за другим и выполняет их последовательно. Или не. Это может также создать поток для каждой задачи и запустить их параллельно. Какая разница? Эта часть не входит в понятие;)

jeancallisti
источник
2

Здесь есть немного семантики, чтобы прояснить это:

Параллелизм или параллелизм - это вопрос конкуренции за ресурсы , тогда как асинхронный - это поток управления .

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

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

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

Эванс А.Б.
источник
2

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

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

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

Асинхронное программирование помогает нам достичь параллелизма. Асинхронное программирование в многопоточной среде - это способ достижения параллелизма.

Дирендра Гаутам
источник
2

«Синхронизация и асинхронность - это модели программирования. Параллельные и параллельные - это способы выполнения задач ...». Источник: https://medium.com/better-programming/sync-vs-async-vs-concurrent-vs-parallel-5754cdb60f66

Другими словами, sync и async описывают, как ваша программа выполняется при вызове функции (будет ли она ждать или будет выполняться?), В то время как параллельная и параллельная описывают, как будет выполняться функция (задача) (concurrent = возможно, выполняется в в то же время, параллельно = эффективно выполняется в то же время).

Педро Боечат
источник
Медиум не является источником, это статья другого человека, рассказывающая о его (неправильном) понимании предмета, она не делает его / ее авторитетом.
Моха всемогущий верблюд
1
Это цитата, поэтому источник. Большинство ответов здесь не написаны властями ни в какой области, и объяснение, которое дал автор, достаточно хорошо.
Педро Боечат
В stackoverflow у вас по крайней мере есть система голосования, и это сообщество профессионалов. Любой может написать что-нибудь на носителе. Это не честное сравнение между ними.
Моха всемогущий верблюд
1
Здесь каждый может написать что угодно, я не знаю, почему вы выбираете Medium. Во всяком случае, я профессиональный программист, и я поддерживаю это понимание. И я нахожу это изящным, потому что это относительно коротко.
Педро Бочат
Проблема не в том, что Medium - плохой источник, а в том, что ответ, который просто ссылается на внешнюю страницу, не является ответом. Вы можете значительно улучшить этот ответ, если подробно остановитесь на цитируемой части или кратко изложите содержание статьи, а не просто дадите ссылку на нее.
Дэвид Шварц
1

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

RVA
источник
1

Здесь я объясню с некоторыми примерами


параллелизм

ГПУ использует параллельную обработку для обработки один и тот же блок кода (АКА ядра ) на тысячи физических и логических потоков. В идеале процесс начинается и заканчивается для всех потоков одновременно. Одно ядро ​​ЦП без гиперпоточности не может выполнять параллельную обработку.

Примечание: я сказал в идеале, потому что когда вы запускаете ядро ​​с размерами вызовов 7M на оборудовании с потоками 6M, оно должно дважды запускать один и тот же код на всех потоках 6M параллельно, потребляя при этом все потоки 6M каждый раз.

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

Примечание. Параллелизм не ограничивается графическим процессором.


совпадение

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

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

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

Примечание . Эти запросы обычно потребляют некоторые важные ресурсы, такие как память, подключение к базе данных или пропускная способность. Тем не менее, вы хотите, чтобы веб-сервис всегда был отзывчивым. Асинхронность является ключом, чтобы сделать его отзывчивым , а не параллельным


Асинхронный

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

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

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


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

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

Например, в приведенном ниже коде WPF + C # await Task.Run(()=> HeavyMethod(txt))решается проблема асинхронности, а textBox.Dispatcher.Invokeрешается проблема параллелизма:

private async void ButtonClick(object sender, RoutedEventArgs e)
{
    // run a method in another thread
    await Task.Run(()=> HeavyMethod(txt));

    // modify UI object in UI thread
    txt.Text = "done";
}

// This is a thread-safe method. You can run it in any thread
internal void HeavyMethod(TextBox textBox)
{
    while (stillWorking)
    {
        // use Dispatcher to safely invoke UI operations
        textBox.Dispatcher.Invoke(() =>
        {
            // UI operations outside of invoke will cause ThreadException
            textBox.Text += ".";
        });
    }
}
Бижан
источник
0

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

Параллельные и параллельные - способы выполнения задач.

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

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

Синхронный и Асинхронный - Модели программирования.

При синхронизации вы пишете код в виде шагов, которые выполняются по порядку, сверху вниз. В модели асинхронного программирования вы пишете код в виде задач, которые затем выполняются одновременно. Одновременное выполнение означает, что все задачи, вероятно, выполняются одновременно.

Срикант Бандару
источник