Як сформулювати різницю між асинхронним та паралельним програмуванням?


139

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

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

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


Я написав повідомлення в блозі про зв’язок між асинхронним та паралельним програмуванням - anat-async.blogspot.com/2018/08/…
Олексій Кайгородов


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

Відповіді:


87

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

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


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

1
Msgstr "" "Щоб зробити анімацію потрібно тривалий час, тому, якби ви запускали її в рамках свого програмного забезпечення для редагування анімації, ви переконайтесь, що (...)". Що?

Щодо частини 3D-анімації: Перш за все, ви б ніколи не запускали 3D-графічну програму з генеруючими кадрами на процесорі - будь-яка розумна людина відразу запропонувала б використовувати GPU. По-друге, якщо ми це зробимо (сильно не рекомендуємо), ми використали б таймер для вимірювання кількості кадрів, які ми можемо візуалізувати, інакше ми могли б створити стопку незавершених завдань візуалізації. Але ваша думка цілком справедлива для більшості додатків 2D-рендерінгу, які відображаються на основі подій на основі вводу на кожного користувача.
ワ イ き ん ぐ

1
Асинхронність і неблокування - це різні парадигми.
Маркіз Лорн

73

Я вважаю, що головна відмінність - між паралельністю і паралелізмом .

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

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

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

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

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

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


37

Ця стаття це дуже добре пояснює: http://urda.cc/blog/2010/10/04/asynchronous-versus-parallel-programming

Це стосується асинхронного програмування:

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

це про паралельне програмування:

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

і це в підсумку:

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


3
Ця стаття> всі відповіді тут (крім цієї, звичайно!)
FellyTone84

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

18

Моє основне розуміння:

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

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

Це, мабуть, складніше, ніж це, але я думаю, що це основна відмінність.


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

13

Я схильний думати про різницю в цих термінах:

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

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

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


13

async : зробіть це самостійно десь в іншому місці та повідомте мене про завершення (зворотний дзвінок). На той час я можу продовжувати робити свою справу.

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

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

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

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


11

Це питання порядку виконання.

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

Якщо A паралельно B, то речі в A відбуваються одночасно з речами у B. Однак порядок виконання все ж може бути визначений.

Можливо, складність полягає в тому, що слово асинхронний є однозначним.

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

Моя команда покоївок працює паралельно, коли кожна з них миє інше вікно.

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

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

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

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


9

Чому асинхронний?

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

Чому паралельне програмування?

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


5

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

Паралельне програмування Скажімо, у вас є завдання прочитати, скажімо, 100 рядків з текстового файлу, а читання одного рядка займає 1 секунду. Отже, вам знадобиться 100 секунд, щоб прочитати текстовий файл. Тепер ви переживаєте, що клієнт повинен зачекати 100 секунд, щоб операція закінчилася. Отже, ви створюєте ще 9 клонів і змушуєте кожного з них прочитати 10 рядків з текстового файлу. Тепер час, що займає, становить лише 10 секунд, щоб прочитати 100 рядків. Отже, ви маєте кращі показники.

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


4

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

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


4

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

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

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

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

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

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

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

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

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


2

Як правило, є лише два способи, коли ви можете робити більше, ніж один раз. Одне є асинхронним , інше - паралельним .

З високого рівня, як і популярний сервер NGINX та знаменита бібліотека Python Tornado , вони обидва повністю використовують асинхронну парадигму, що однопотоковий сервер може одночасно обслуговувати тисячі клієнтів (деякі IOloop та зворотний виклик ). Використовуючи ECF (слідкуйте за винятком контролю), який міг би реалізувати парадигму асинхронного програмування. так що асинхронність іноді насправді не робить річ одночасно, але якась робота, пов'язана з іоном, асинхронність дійсно може підвищити продуктивність.

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


-1

Короткий зміст всіх вищезазначених відповідей

  1. паралельні обчислення:

▪ вирішує питання пропускної здатності. Стурбований тим, що розбиває велике завдання на менші шматки

▪ пов'язана з машиною (потрібна декілька машин / ядер / процесор / процесор), наприклад: головний ведений, зменшення карти.

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

  1. асинхронний:

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

▪ пов'язана з потоком (потрібна декілька потоків)

Threading (використовуючи Thread, Runnable, Executor) - один із основних способів виконання асинхронних операцій на Java

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