Чим відрізняється паралельність, паралелізм від асинхронних методів?


177

Паралельність - це виконання двох завдань паралельно окремим потокам. Однак асинхронні методи працюють паралельно, але на одній і тій же 1 нитці. Як це досягається? Також, що про паралелізм?

Які відмінності між цими 3 поняттями?


8
Термін "асинхронний" може означати дуже багато різних речей. Ці терміни пов'язані між собою, але вони не описують розрізнених наборів речей. Значення перетинаються і залежать від ситуації.
Поні

2
Тож спочатку одночасність виконує одночасно два чи більше процесів. З цим не виходить, що паралельно не є паралельним. Паралельні процеси вимагають двох або більше ядер, тоді як паралельні процеси можуть за часом ділити одне ядро.
Rick O'Shea

Відповіді:


139

Одночасне та паралельне фактично є тим самим принципом, який ви правильно вважаєте, обидва пов'язані із виконанням завдань одночасно, хоча я б сказав, що паралельні завдання повинні бути справді багатозадачними, виконуючись "одночасно", тоді як одночасне може означати, що завданнями є спільне використання потік виконання, але все ще видається, що він виконується паралельно.

Асинхронні методи безпосередньо не пов'язані з попередніми двома концепціями, асинхронність використовується для подання враження одночасного або паралельного виконання завдань, але фактично виклик асинхронного методу зазвичай використовується для процесу, який потребує відмови від поточної програми, і ми Не хочу чекати і заблокувати нашу програму, яка очікує на відповідь.

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

З точки зору користувача, це виглядає як багатозадачність, але це може бути не так.


EDIT

Напевно, варто додати, що в багатьох реалізаціях виклик асинхронного методу призведе до того, що потік буде запускатися, але це не суттєво, це дійсно залежить від операції, що виконується, і від того, як відповідь може бути повідомлено назад в систему.


34
Я б стверджував, що у вас в першому абзаці змішані паралелізм і сумісність. Під паралельністю розуміється управління декількома потоками виконання, де конкретніше паралелізм, кілька потоків виконання одночасно. Паралельність - це більш широкий термін, який може охоплювати паралелізм.
Марк Н

7
Незважаючи на те, що два слова дуже схожі і їх можна переплутати (і часто є), вони мають різні визначення: Concurrent = існуюче, що відбувається, або виконане одночасно. Паралельна = або стосується явної чи фактичної роботи більше однієї операції одночасно одними і тими ж або різними пристроями. Як ви бачите, паралель не обов'язково означає одночасність, але може бути просто одночасною. Зрештою, слова часто вживаються взаємозамінно, а з n dev - це кімната, ви, ймовірно, отримаєте n + 1 означення;)
Лазар,

3
@Mehrdad Якщо ви збираєтесь базувати свої визначення словникових слів на їх використанні в маркетингових матеріалах, то, я думаю, ви, швидше за все, опинитесь у дефіциті.
Лазар

6
Неправильно. У контексті програмування одночасність - це здатність вашого коду "складатись" в біти логіки, які можна було б запустити одночасно. Паралелізм (у поєднанні з одночасністю) - це взяття зазначеного коду і запуск його на 100-ядерній машині.
Френк Радочай

2
@FrankRadocaj має право. Паралельно означає, що програму можна розділити на одиниці (одиниці, які по суті є нитками), які можуть бути запущені в будь-якому порядку і мати визначений результат. Паралельно означає, що ці блоки / потоки виконуються буквально одночасно на декількох процесорах.

89

Коротко,

Паралельність означає безліч завдань, які починаються, виконуються та виконуються в періоди, що перетинаються, у певному порядку. Паралелізм - це коли декілька завдань АБО декілька частин унікальної задачі буквально виконуються одночасно, наприклад, на багатоядерному процесорі.

Пам'ятайте, що паралельність і паралелізм НЕ одне і те ж.

Відмінності між паралельністю та паралелізмом

Тепер перерахуємо помітні відмінності між паралельністю та паралелізмом.

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

Паралельність - це склад незалежно виконуваних процесів, тоді як паралелізм - це одночасне виконання (можливо, пов'язаних) обчислень.

Паралельність - це вирішення справи з багатьма речами одночасно. Паралелізм - це робити багато справ одночасно.

Додаток може бути одночасно - але не паралельно, це означає, що воно обробляє більше одного завдання одночасно, але жодне два завдання не виконується одночасно.

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

Додаток не може бути ні паралельним, ні одночасним, а це означає, що він обробляє всі завдання по одному послідовно.

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

Паралельність

Паралельність по суті застосовна, коли ми говоримо про мінімум два завдання або більше. Коли програма здатна виконати дві задачі практично одночасно, ми називаємо це одночасною програмою. Хоча тут виконання завдань схоже на одночасне, але по суті вони МОЖУТЬ не виконувати. Вони скористаються функцією розрізання часу процесора в операційній системі, де кожна задача виконує частину свого завдання, а потім переходить у стан очікування. Коли перша задача знаходиться в стані очікування, CPU присвоюється другій задачі, щоб виконати її частину завдання.

Операційна система на основі пріоритетності завдань, таким чином, призначає процесор та інші обчислювальні ресурси, наприклад, пам'ять; по черзі звертайтеся до всіх завдань і дайте їм можливість виконати. Кінцевому користувачеві здається, що всі завдання виконуються паралельно. Це називається паралельністю.

Паралелізм

Паралелізм не вимагає існування двох завдань. Він буквально фізично виконує частини завдань АБО декількох завдань, одночасно використовуючи багатоядерну інфраструктуру ЦП, присвоюючи одне ядро ​​кожному завданню або підзадачі.

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

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

Це не пов’язано з паралельністю та паралелізмом, асинхронність використовується для подання враження одночасного чи паралельного виконання завдань, але фактично виклик асинхронного методу зазвичай використовується для процесу, який потребує відмови від поточної програми, і ми не хочемо зачекайте та заблокуйте нашу програму в очікуванні відповіді.


2
Дуже корисний. Спасибі
Неха

Я все ще плутаю Async проти одночасності. Я бачив використовувані фрази "виконання завдань асинхронно" та "виконання завдань одночасно". Виконання завдань асинхронним, а виконання завдань одночасно, здається, означає те саме?
Мондра

1
@Moondra Async завдання працює на одній нитці, нічого не пов’язаного з багатопотоковою читанням. Задача async надсилає завдання зовнішньому процесу поза вашим додатком ... тобто базі даних, зчитувачу файлів ... це процеси IO, тоді зворотний виклик додається в процесі для виконання дії, коли процес IO закінчений. в чому я не впевнений, що в деякій мові програмування є деякі функції "асинхронізації", які створюють окрему нову нитку, коли ви викликаєте завдання async, я чув, що C # є одним, але я не впевнений у цьому
Tobi Owolawi

56

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

Паралелізм - це коли ці завдання реально виконуються паралельно.

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


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

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

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


6
Проста, ефективна ілюстрація.
contactmatt

1
чи паралельність така ж, як асинхронність?
NOS

1
Ці 2 концепції дуже близькі, але не однакові. На практиці асинхронність більше пов'язана з взаємодією між діями (скажімо, A & B), де одна (B) спрацьовує інша (A) і чи буде другий чекати, коли перша завершиться. Паралельність - це більш загальні умови для дій, які також можуть бути не пов’язані між собою і незалежно від того, чи вони виконуються послідовно, або їх виконання перемежовуються.
Дімос

1
Тож асинхронність переважно стосується блокування та неблокування
Даніель

15

У всіх виникають проблеми, пов'язані з асинхронністю ні паралелізмом, ні паралельністю, оскільки асинхронність не є антонімом ні паралельним, ні паралельним. Це антонім Синхронний. Що просто вказує, чи щось, у цьому випадку нитки, буде синхронізовано з чимось іншим, у цьому випадку іншим потоком.


13

Існує кілька сценаріїв, за яких може виникати одночасність:

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

Паралелізм - це означає, що ваша програма використовує обладнання багатоядерних машин для виконання завдань одночасно, розбиваючи роботу на завдання, кожна з яких виконується на окремому ядрі. Це трохи схоже на спів під душем: ви насправді робите дві речі точно в один і той же час.

Багатопотоковість - Це програмне забезпечення, що дозволяє одночасно виконувати різні потоки. Здається, що багатопотокова програма робить кілька справ одночасно, навіть коли вона працює на одноядерній машині. Це трохи схоже на спілкування з різними людьми через різні вікна чату; хоча ви насправді перемикаєтесь назад і назад, чистий результат полягає в тому, що ви ведете кілька розмов одночасно.


Це справді хороші аналогії! Дякую. Чи було б справедливо сказати, що одночасність можна визначити за допомогою вашого багатопотокового визначення? Отже, паралельність = багатопоточність на одноядерному, схоже, що це відбувається одночасно, але це дійсно швидко перемикається назад і назад?
wongz

3

Паралельність

Паралельність означає, що програма одночасно (одночасно) досягає декількох завдань. Добре, якщо на комп’ютері є лише один процесор, програма може не досягти прогресу над більш ніж однією задачею в один і той же час, але одночасно всередині додатка обробляється більше ніж одне завдання. Це не повністю закінчить одне завдання, перш ніж розпочне наступне.

Паралелізм

Паралелізм означає, що програма розбиває свої завдання на більш дрібні підзадачі, які можна обробляти паралельно, наприклад, на декілька центральних процесорів в той самий час.

Паралельність проти паралелізму в деталях

Як бачите, паралельність пов'язана з тим, як програма обробляє декілька завдань, над якими вона працює. Додаток може обробляти одне завдання одночасно (послідовно) або працювати над декількома завданнями одночасно (одночасно).

Паралелізм, з іншого боку, пов'язаний з тим, як програма обробляє кожне окреме завдання. Додаток може обробляти завдання послідовно від початку до кінця або розділяти завдання на підзадачі, які можна виконати паралельно.

Як бачите, додаток може бути паралельним, але не паралельним. Це означає, що вона обробляє більше одного завдання одночасно, але завдання не розбиваються на підзадачі.

Додаток також може бути паралельним, але не паралельним. Це означає, що програма працює лише над однією задачею, і це завдання розбивається на підзадачі, які можна обробляти паралельно.

Крім того, додаток не може бути ні одночасним, ні паралельним. Це означає, що вона працює лише по одному завданню, і це завдання ніколи не розбивається на підзадачі для паралельного виконання.

Нарешті, додаток може бути одночасно і паралельним, і тим, що він працює одночасно над кількома завданнями, а також розбиває кожне завдання на підзадачі для паралельного виконання. Однак деякі переваги паралельності та паралелізму можуть бути втрачені в цьому сценарії, оскільки процесори в комп’ютері вже достатньо зайняті або одночасністю, або паралелізмом. Поєднання цього може призвести до лише невеликого підвищення продуктивності або навіть втрати продуктивності. Переконайтесь, що ви аналізуєте та вимірюєте, перш ніж сліпо прийняти паралельну паралельну модель.

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


3

Паралельно:Це широкий термін, який означає, що два фрагменти коду виконують це "одночасно". Не має значення, чи це "справжній" паралелізм, чи він підроблений через якусь розумну модель дизайну. Справа в тому, що ви можете одночасно запускати "завдання", а потім керувати ними окремо (з мютекс та всі відповідні хитрощі). Але зазвичай ви вважаєте за краще використовувати слово "паралельний" лише для "справжнього" паралелізму, як в: ви робите це через некооперативну багатозадачність (будь то керування ядрами CPU / GPU або лише на програмному рівні, дозволяючи ОС керувати ним на дуже низькому рівні). Люди неохоче говорять "паралельно" лише для складного послідовного коду, який підробляє паралелізм, як, наприклад, у JavaScript у вікні браузера. Звідси причина, чому люди в цій темі кажуть, що "асинхронність не має нічого спільного з паралелізмом". Добре це, але просто не плутати їх.

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

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

"Асинхронний" означає представлення паралелізму, яке формалізує три основні речі, які зазвичай беруть участь у паралелізмі: 1) визначити ініціалізацію завдання (скажімо, коли вона починається та які параметри вона отримує), 2) що потрібно зробити після її закінчення та 3) Що код повинен продовжувати робити між ними.

Але це все ще лише синтаксис (зазвичай він представлений як методи зворотного виклику). Позаду сцени основна система може просто вирішити, що ці так звані "завдання" - це лише фрагменти коду, які потрібно зібрати, доки він не закінчить код, який він виконує в даний час. А потім він розгортає їх по черзі і виконує їх послідовно. Чи ні. Він також може створити потік для кожного завдання та запустити їх паралельно. Кого хвилює? Ця частина не включена в поняття;)


2

Тут слід розібратися трохи семантики:

Паралельність або паралелізм - це питання суперечності ресурсів , тоді як "Асинхронність" - про контрольний потік .

Різні процедури (або їх складові операції ) називаються асинхронними, коли немає детермінованого виконання порядку їх обробки ; іншими словами, існує ймовірність, що будь-який з них може бути оброблений в будь-який момент часу Т. За визначенням, декілька процесорів (наприклад, процесори або особи) дозволяють обробляти декілька з них одночасно; на одному процесорі їх обробка перемежована (наприклад, нитки).

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

Отже, асинхронна процедура або операція може оброблятися паралельно або одночасно з іншими.


2

Паралельність означає виконання декількох завдань одночасно, але не обов'язково одночасно. Коли вам доведеться виконати більше ніж одне завдання, але у вас є один ресурс, тоді ми йдемо на конкуренцію. У одноядерному середовищі одночасність досягається за допомогою комутації контексту.

Паралелізм - це виконання одночасно декількох завдань, як ви можете співати та купатися разом. Тепер ви виконуєте завдання в паралелі.

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

Асинхронне програмування допомагає нам досягти одночасності. Асинхронне програмування у багатопотоковому середовищі - це спосіб досягти паралелізму.


2

"Синхронізація та асинхронізація - це моделі програмування. Паралельні та паралельні способи виконання завдань ...". Джерело: https://medium.com/better-programming/sync-vs-async-vs-concurrent-vs-parallel-5754cdb60f66

Іншими словами, синхронізація та асинхронізація описують, як ваша програма виконує під час виклику функції (буде вона чекати чи продовжить її виконання?), А паралельно і паралельно описуйте, як виконується функція (завдання) (concurrent = можливо виконується при той же час, паралель = ефективно виконується одночасно).


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

1
Це цитування, тому джерело. Більшість відповідей тут не написані властями в будь-якій галузі, і пояснення, які автор дав, досить хороші.
Педро Бохат

У stackoverflow ви маєте принаймні систему голосування, і це спільнота професіоналів. Будь-хто може написати що завгодно на носії. Це не справедливе порівняння між ними.
Моха всемогутній верблюд

1
Тут також може написати що завгодно, я не знаю, чому ви збираєтеся на Medium. У всякому разі, я професійний програміст і підтримую це розуміння. І я вважаю це елегантним, оскільки його порівняно короткий.
Педро Бохат

Проблема не в тому, що Medium є поганим джерелом, проблема полягає в тому, що відповідь, яка посилається лише на зовнішню сторінку, не є відповіддю. Ви можете значно покращити цю відповідь, якби ви детальніше описували цитовану частину або узагальнювали зміст статті, а не просто посилалися на неї.
Девід Шварц

1

ВІДПОВІДАЛЬНІСТЬ ПАРАЛЕЛІЗМУ: паралельність в один момент часу може бути виконана лише одним завданням. Приклад: паралелізм одного процесора процесора в один момент ми можемо виконати кілька завдань. приклад: двоядерний або багатоядерний процесор


1

Тут я пояснюю з деякими прикладами


Паралелізм

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

Примітка. Я сказав, що ідеально, тому що коли ви запускаєте ядро ​​розміром 7М викликів на апаратному забезпеченні з 6М потоками, воно повинно запускати двічі, виконуючи один і той же код на всіх 6М потоках паралельно, одночасно споживаючи всі 6М потоків.

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

Примітка. Паралелізм не обмежується GPU.


Паралельність

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

Просто уявіть, що користувач оновлює запис, а інший користувач одночасно видаляє той самий запис.

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

Примітка . Ці запити зазвичай споживають деякі основні ресурси, такі як пам'ять, підключення до бази даних або пропускну здатність. Тим не менш, ви хочете, щоб веб-служба відповідала завжди. Асинхронність - це ключ до того, щоб зробити його чуйним , а не одночасним


Асинхронний

Один важкий процес (наприклад, операція вводу / виводу) може легко заблокувати графічний інтерфейс, якщо він запускається на потоці GUI. Щоб гарантувати чуйність інтерфейсу , важкий процес може виконуватися асинхронно. Краще виконувати подібні операції з асинхронізацією по черзі . наприклад, кілька операцій, пов'язаних з введенням, можуть бути значно повільнішими, якщо вони виконуються одночасно, тому краще поставити їх у чергу, щоб почати

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

Примітка: операція асинхронізації, яка виконується одночасно (тобто більше одного разу за раз), є одночасною операцією.


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

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

наприклад, у коді 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

Я зроблю коротко і цікаво обернути голову навколо цих понять.

Паралельно проти паралельних - виконуються завдання способів.

Візьміть приклад у реальному житті: є виклик, який вимагає, щоб ви їли цілий величезний торт і співали цілу пісню. Ви виграєте, якщо найшвидший, хто співає всю пісню і закінчує торт. Отже, правило полягає в тому, що ви співаєте і їсте одночасно . Як ви це зробите, не належить до правила. Ви можете з'їсти цілий торт, потім заспівати всю пісню, або можете з’їсти половину пирога, потім заспівати пів пісні, потім зробити це знову і т.д.

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

Синхронні та асинхронні - моделі програмування.

Синхронізуючи, ви пишете код як кроки, які виконуються в порядку, зверху вниз. У моделі програмування async ви пишете код як завдання, які потім виконуються одночасно. Виконання одночасно означає, що всі завдання, ймовірно, виконуються одночасно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.