Яка різниця між асинхронним та синхронним виконанням?
Яка різниця між асинхронним та синхронним виконанням?
Відповіді:
Виконуючи щось синхронно, ви чекаєте його закінчення, перш ніж перейти до іншого завдання. Виконавши щось асинхронно, ви можете перейти до іншого завдання, перш ніж воно закінчиться.
За словами, в контексті комп'ютерів це означає виконання процесу або завдання на іншій "потоці". Потік - це низка команд (блок коду), яка існує як одиниця роботи. Операційна система може керувати декількома потоками і присвоювати потоку шматок ("зріз") часу процесора перед переходом на інший потік, щоб надати йому чергу для виконання певної роботи. За своєю суттю (вибачте за каламбур) процесор може просто виконати команду, у неї немає поняття робити дві речі одночасно. Операційна система імітує це, виділяючи відрізки часу на різні потоки.
Тепер, якщо ви вводите декілька ядер / процесорів у суміш, то речі МОЖУТЬ відбутися одночасно. Операційна система може виділити час одному потоку на першому процесорі, потім виділити той же блок часу іншому потоку на іншому процесорі. Все це стосується дозволу операційній системі керувати виконанням вашого завдання, тоді як ви можете продовжувати діяти у своєму коді та робити інші речі.
Асинхронне програмування є складною темою через семантику того, як речі з’єднуються, коли ви можете їх одночасно робити. Є численні статті та книги на цю тему; гляньте!
Синхронний / асинхронний НЕ МОЖЕ ДІЙСЯ З МНОГОТРІБНОМИ.
Синхронний або синхронізований означає «підключений» або «залежний» певним чином. Іншими словами, дві синхронні задачі повинні бути обізнані одне про одне, і одне завдання має виконуватися певним чином, залежним від іншого, як, наприклад, чекати початку, поки інше завдання не буде виконано.
Асинхронні означають, що вони абсолютно незалежні, і жоден не повинен розглядати інший ні в якому разі, ні в ініціації, ні у виконанні.
Синхронні (одна нитка):
1 thread -> |<---A---->||<----B---------->||<------C----->|
Синхронні (багатопотокові):
thread A -> |<---A---->|
\
thread B ------------> ->|<----B---------->|
\
thread C ----------------------------------> ->|<------C----->|
Асинхронний (одна нитка):
A-Start ------------------------------------------ A-End
| B-Start -----------------------------------------|--- B-End
| | C-Start ------------------- C-End | |
| | | | | |
V V V V V V
1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->|
Асинхронні (багатопотокові):
thread A -> |<---A---->|
thread B -----> |<----B---------->|
thread C ---------> |<------C--------->|
<
, >
символи.|
Технічно поняття синхронного / асинхронного дійсно не має нічого спільного з потоками . Хоча, як правило, незвично знайти асинхронні завдання, що працюють на одній нитці, можливо, (див. Приклади нижче), і звичайно знайти два чи більше завдань, що синхронно виконуються на окремих потоках ... Ні, концепція синхронного / асинхронного стосується виключно того, чи може бути запущена друга чи наступна задача до того, як інша (перша) задача буде виконана, чи вона повинна почекати. Це все. Який потік (або потоки), або процеси, або процесори, і справді, на якому апаратному забезпеченні виконуються завдання, які не виконуються. Дійсно, для цього я відредагував графіку, щоб це показати.
АСИНХРОННИЙ ПРИКЛАД:
При вирішенні багатьох інженерних проблем програмне забезпечення призначене для розбиття загальної проблеми на кілька окремих завдань, а потім їх виконання асинхронно. Інвертування матриці чи проблема аналізу кінцевих елементів - хороші приклади. При обчисленні сортування списку є прикладом. Наприклад, звичайна схема швидкорозбиття розбиває список на два списки і виконує кікспорт на кожному з них, називаючи себе (quicksort) рекурсивно. В обох вищезазначених прикладах обидва завдання можуть (і часто виконувалися) виконуватись асинхронно. Їм не потрібно бути на окремих нитках. Навіть машина з одним процесором і лише одним потоком виконання може бути кодована, щоб ініціювати обробку другого завдання до завершення першого. Єдиним критерієм є те, що результати однієї задачі не потрібні як вхідні дані до іншого завдання. Поки час початку та кінця завдань перекриваються (можливо, лише якщо вихідні дані не потрібні як входи до іншого), вони виконуються асинхронно, незалежно від того, скільки потоків використовуються.
СИНХРОННИЙ ПРИКЛАД:
Будь-який процес, що складається з декількох завдань, де завдання повинні виконуватися послідовно, але їх потрібно виконувати на іншій машині (Вилучення та / або оновлення даних, отримання котирування акцій від фінансової служби тощо). Якщо це на окремій машині, це на окремому потоці, синхронному чи асинхронному.
Простіше кажучи:
СИНХРОННО
Ви стоїте в черзі, щоб отримати квиток на кіно. Ви не можете отримати його, поки всі перед вами не отримають, і те саме стосується людей, що стоять у черзі за вами.
АСИНХРОННИЙ
Ви в ресторані з багатьма іншими людьми. Ви замовляєте їжу. Інші люди також можуть замовити свою їжу, їм не потрібно чекати, коли ваші страви будуть приготовані та подані вам, перш ніж вони зможуть замовити. На кухні працівники ресторану постійно готують, подають та приймають замовлення. Люди отримують їжу, яку подають, як тільки її приготують.
Синхронне виконання
Мій начальник - зайнята людина. Він каже мені написати код. Я йому кажу: Чудово. Я починаю, і він спостерігає за мною, як гриф, що стоїть позаду мене, за плечима. Я як "Чувак, WTF: чому ти не підеш і не зробиш щось, поки я закінчу це?"
він такий: "Ні, я чекаю тут, поки ви не закінчите". Це синхронно.
Асинхронне виконання
Бос каже мені це зробити, і замість того, щоб чекати там своєї роботи, начальник відходить і виконує інші завдання. Коли я закінчую роботу, я просто доповідаю своєму начальнику і кажу: "Я ВСТАНОВЕНО!" Це асинхронне виконання.
(Візьміть мою пораду: НІКОЛИ не працюйте з начальником за вами.)
Синхронне виконання означає, що виконання відбувається в одній серії. A->B->C->D
. Якщо ви викликаєте ці підпрограми, A
запустіть, потім закінчіть, потім B
почніть, потім закінчіть, потім C
почнемо і т.д.
З асинхронним виконанням ви починаєте рутину, і нехай вона працює у фоновому режимі, поки ви починаєте наступну, а потім в якийсь момент скажіть "зачекайте, коли це закінчиться". Це більше схоже на:
Почніть A->B->C->D->
Зачекати, коли A
закінчиться
Перевага полягає в тому, що ви можете виконувати B
, C
і або D
поки A
він працює (на задньому плані, на окремій потоці), так що ви можете краще скористатися своїми ресурсами і мати менше "зависань" або "очікувань".
У двох словах, синхронізація відноситься до двох і більше початкових і кінцевих точок процесів, а не до їх виконання . У цьому прикладі кінцева точка процесу A синхронізується з початковою точкою процесу B:
СИНХРОННО | -------- A -------- | | -------- B -------- |
З іншого боку, асинхронні процеси не мають синхронізованого початку та кінцевих точок:
АСИНХРОННИЙ | -------- A -------- | | -------- B -------- |
Там, де Process A перекривається Process B, вони працюють одночасно або синхронно (визначення словника), звідси плутанина.
ОНОВЛЕННЯ: Чарльз Бретана вдосконалив свою відповідь , тому ця відповідь тепер є простою (потенційно надто спрощеною) мнемонікою.
Синхронний означає, що абонент чекає відповіді або завершення, асинхронний тому, що абонент продовжує, і відповідь надходить пізніше (якщо це застосовується).
Як приклад:
static void Main(string[] args)
{
Console.WriteLine("Before call");
doSomething();
Console.WriteLine("After call");
}
private static void doSomething()
{
Console.WriteLine("In call");
}
Це завжди вийде:
Before call
In call
After call
Але якби ми зробили doSomething асинхронним (декілька способів це зробити), то висновком може стати:
Before call
After call
In call
Тому що метод здійснення асинхронного виклику негайно продовжиться з наступного рядка коду. Я кажу "міг", оскільки порядок виконання не може бути гарантований операціями асинхронізації. Він також може бути виконаний як оригінал, залежно від часу потоку тощо.
Я думаю, що це дещо кругле пояснення, але все ж це з'ясовується на прикладі реального життя.
Маленький приклад:
Скажімо, відтворення аудіо включає три кроки:
Якщо ваш аудіоплеєр робить крок 1,2,3 послідовно для кожної пісні, це синхронно. Вам доведеться почекати деякий час, щоб почути пісню, поки пісня насправді не дістане та декомпресується.
Якщо ваш аудіоплеєр робить крок 1,2,3 незалежним один від одного, він є асинхронним. тобто. Під час відтворення аудіо 1 (крок 3), якщо він отримує аудіо 3 з жорсткого диска паралельно (крок 1), і він декомпресує аудіо 2 паралельно. (крок 2) Ви почуєте пісню, не чекаючи багато чого та вийміть її з неї.
Операції синхронізації та асинхронізації стосуються порядку виконання нового завдання стосовно поточного завдання. Два завдання на столі: поточне завдання та нове завдання
Синхронність (блокування) - означає, що завдання будуть виконуватися по черзі. Наступне завдання починається лише після завершення попереднього завдання. Task 2
не запускається, поки не Task 1
буде закінчено
Асинхронний (не блокуючий) - означає, що завдання негайно повертає контроль з обіцянкою виконати код та повідомити про результат пізніше (наприклад, зворотний дзвінок, функція). Task 2
виконується, навіть якщо Task 1
не закінчено
ТАК відповідь про синхронізацію та асинхронізацію: в iOS , в Android
Простіше кажучи, асинхронне виконання робить речі у фоновому режимі.
Наприклад, якщо ви хочете завантажити файл з Інтернету, ви можете скористатися синхронною функцією, але це заблокує ваш потік, поки файл не закінчиться завантаженням. Це може зробити вашу програму невідчутною для будь-якого введення користувача.
Замість цього ви можете завантажити файл у фоновому режимі, використовуючи асинхронний метод. У цьому випадку функція завантаження негайно повертається, а виконання програми триває нормально. Усі операції з завантаження виконуються у фоновому режимі, і ваша програма буде повідомлена про її завершення.
Як справді простий приклад,
СИНХРОННО
Уявіть, що 3 учні школи доручили проводити естафету на дорозі.
1-й учень пробігає свою задану дистанцію, зупиняється і передає естафету 2-й. Більше ніхто не почав бігати.
1------>
2.
3.
Коли 2-й учень отримує естафету, вона починає пробігати задану дистанцію.
1.
2------>
3.
2-й учень розв'язав шнурок. Тепер вона зупинилася і знову зав'язується. Через це час кінця 2-го розширився, а час початку третього затримався.
1.
--2.--->
3.
Ця закономірність триває, поки третя не витягне естафету з 2-го і закінчить гонку.
АСИНХРОННИЙ
Просто уявіть 10 випадкових людей, що йдуть тією ж дорогою. Звичайно, вони не стоять на черзі, вони просто випадковим чином ходять різними місцями на дорозі різними кроками.
Шнурок 2-ї людини розв'язався. Вона зупинилася, щоб знову її зав'язати.
Але ніхто не чекає від неї, щоб її зав'язали. Всі інші все ще йдуть тим же шляхом, який вони робили раніше, таким же темпом.
10--> 9-->
8--> 7--> 6-->
5--> 4-->
1--> 2. 3-->
Я створив gif для пояснення цього, сподіваюся, що це буде корисно: дивіться, рядок 3 є асинхронним, а інші - синхронними. всі рядки перед рядком 3 повинні чекати, поки рядок не закінчить свою роботу, але, оскільки рядок 3 є асинхронним, наступний рядок (рядок 4) не чекайте рядка 3, а рядок 5 повинен чекати, коли рядок 4 закінчить свою роботу, і рядок 6 повинен чекати рядків 5 і 7 для 6, тому що рядок 4,5,6,7 не є асинхронним.
Виконуючи послідовність типу: a> b> c> d>, якщо в середині виконання ми отримуємо помилку, наприклад:
a
b
c
fail
Потім ми починаємо спочатку:
a
b
c
d
це синхронно
Якщо ж у нас є одна і та ж послідовність виконання: a> b> c> d>, і у нас є помилка в середині:
a
b
c
fail
... але замість того, щоб перезапустити спочатку, ми починаємо з точки збою:
c
d
... це відомо як асинхронне.
Ви плутаєте Синхронний з Паралельним проти Серії. Синхронне значення означає все одночасно. Синхронізовані засоби, пов'язані з кожною з інших, які можуть означати послідовно або через певний інтервал. Хоча програма робить все, вона працює послідовно. Отримайте словник ... ось чому у нас несолодкий чай. У вас є чай або підсолоджений чай.
Синхронність в основному означає, що ви можете виконувати лише одну річ за один раз. Асинхронність означає, що ви можете виконувати кілька речей одночасно, і вам не потрібно закінчувати виконання поточної речі, щоб перейти до наступної.
Скористайтеся прикладом інструкцій щодо приготування сніданку
Якщо у вас є досвід приготування їжі, ви виконуєте ці інструкції асинхронно. ви почнете розігрівати сковороду для яєць, а потім запустити бекон. Ви поклали б хліб у тостер, а потім запустили яйця. На кожному кроці процесу ви починаєте завдання, а потім звертаєте свою увагу на завдання, готові до вашої уваги.
Приготування сніданку - хороший приклад асинхронної роботи, яка не є паралельною. Одна людина (або нитка) може впоратися з усіма цими завданнями. Продовжуючи аналогію сніданку, одна людина може зробити сніданок асинхронно, запустивши наступне завдання до того, як буде виконано перше. Приготування їжі прогресує, чи це хтось дивиться. Як тільки ви почнете розігрівати сковороду для яєць, можна приступати до смаження бекону. Як тільки бекон почнеться, ви можете покласти хліб в тостер.
Для паралельного алгоритму вам знадобиться кілька кухарів (або потоків). Один би робив яйця, один - бекон тощо. Кожна з них буде зосереджена саме на одному завданні. Кожен кухар (або нитка) буде заблокований синхронно, очікуючи, коли бекон буде готовий перевернутись, або тост попсувати.
Посилання з концепцій асинхронного програмування
Синхронна операція виконує свою роботу, перш ніж повернутися до абонента.
Асинхронна операція виконує (більшість або всю) свою роботу після повернення до абонента.
Що стосується визначення " водночас " синхронного виконання (що часом заплутано), ось хороший спосіб зрозуміти це:
Синхронне виконання : Усі завдання в блоці коду виконуються одночасно.
Асинхронне виконання : Усі завдання в блоці коду виконуються не одночасно.
Я думаю, що хороший спосіб подумати про це - це класичний біг естафети
Синхронний : Процеси, як члени однієї команди, вони не виконуватимуться, поки не отримають естафету (закінчення виконання попереднього процесу / бігуна), і все ж вони діють синхронно один з одним.
Асинхронний : Там, де процеси, як члени різних команд на одній трасі естафет, вони будуть бігати і зупинятися, асинхронізуватися між собою, але в межах однієї гонки (виконання загальної програми).
Чи є сенс?
Інша англійське визначення сінхровектора Тут
Координат; поєднувати.
Я думаю, що це краще визначення, ніж "одночасно відбувається". Це також є визначенням, але я не думаю, що це те, що відповідає тому, як воно використовується в інформатиці.
Таким чином, асинхронна задача не координується з іншими завданнями, тоді як синхронна задача IS координується з іншими завданнями, тому одна закінчується до початку іншої.
Як це досягти - це інше питання.
Виконання синхронного способу виконання черги по черзі буде виконано. Припустимо, є лише транспортний засіб, якому потрібно поділитися між другом, щоб дістатися до місця призначення один за одним транспортним засобом.
У асинхронному випадку кожен друг може взяти в оренду транспортний засіб і досягти пункту призначення.
Так, синхронно означає одночасно, буквально, це означає працювати разом. кілька людей / об'єктів у світі можуть одночасно робити кілька речей, але якщо ми подивимось на комп’ютер, це говорить синхронно, коли процеси працюють разом, що означає, що процеси залежать від повернення один одного, і тому вони виконуються одні за іншим у правильній послідовності. Тоді як асинхронні засоби, коли процеси не працюють разом, вони можуть працювати одночасно (якщо вони є у багатопотокових), але працюють незалежно.