Отже, щоб відповісти на ваше перше та друге запитання:
Неблокування фактично те саме, що і асинхронне - ви робите виклик, і результат ви отримаєте пізніше, але поки це відбувається, ви можете зробити щось інше. Блокування - це навпаки. Ви чекаєте повернення дзвінка, перш ніж продовжувати подорож.
Тепер код Async / Non-blocking звучить абсолютно фантастично, і це так. Але у мене є слова попередження. Async / Non-blocking чудово підходять при роботі в обмежених середовищах, наприклад, в мобільному телефоні ... розгляньте обмеженість процесора / пам'яті. Це також добре для інтерфейсної розробки, де ваш код повинен якось реагувати на віджет UI.
Async має фундаментальне значення для того, як повинні працювати всі операційні системи - вони роблять для вас лайно у фоновому режимі і пробуджують ваш код, коли виконують те, про що ви просили, а коли цей дзвінок не вдається, вам повідомляють, що це не так робота або за винятком, або за якимсь кодом повернення / об'єктом помилки.
У той момент, коли ваш код запитує щось, що займе деякий час, щоб відповісти, ваша ОС знає, що вона може займатися іншими справами. Ваш код - процес, нитка або еквівалент, блоки. Ваш код абсолютно не пам’ятає, що ще відбувається в ОС, поки він чекає встановлення з’єднання з мережею, або поки він чекає цієї відповіді від HTTP-запиту, або поки він чекає, що зчитування / запис файлу, і так далі. Ваш код може "просто" чекати клацання миші. Тоді, що насправді відбувалося в той час, це те, що ваша ОС безперешкодно керує, планує та реагує на "події" - речі, на які шукає ОС, такі як управління пам’яттю, введення-виведення (клавіатура, миша. Диск, Інтернет), інші завдання, відновлення несправностей тощо.
Операційні системи затяті. Вони дійсно добре приховують усі складні асинхронні / неблокуючі речі від вас, програміста. І саме так більшість програмістів дійшли до того місця, де ми сьогодні перебуваємо за допомогою програмного забезпечення. Зараз ми досягаємо обмежень процесора, люди кажуть, що можна робити паралельно для підвищення продуктивності. Це означає, що Async / non-blocking здається дуже сприятливою справою, і так, якщо ваше програмне забезпечення вимагає цього, я можу погодитися.
Якщо ви пишете внутрішній веб-сервер, то будьте обережні. Пам'ятайте, що ви можете масштабувати горизонтально набагато дешевше. Netflix / Amazon / Google / Facebook, однак, є очевидними винятками з цього правила, лише тому, що їм виходить дешевше використовувати менше обладнання.
Я скажу вам, чому асинхронний / неблокуючий код - це кошмар із фоновими системами ....
1) Це стає відмовою в обслуговуванні щодо продуктивності ... Вам потрібно думати НАБАГАТО більше, і на цьому шляху ви робите багато помилок.
2) Сліди стеку в реактивному коді стають нерозбірливими - важко зрозуміти, що називається що, коли, чому і як. Удачі вам у налагодженні.
3) Вам доведеться більше думати про те, як щось не вдається, особливо коли багато речей повертаються з ладу, як ви їх надіслали. У старому світі ви робили по одній справі.
4) Складніше перевірити.
5) Важче підтримувати.
6) Це боляче. Програмування повинно приносити радість і задоволення. Біль подобається лише мазохістам. Люди, які пишуть паралельні / реактивні рамки, є садистами.
І так, я писав як синхронізацію, так і асинхронізацію. Я вважаю за краще синхронний, оскільки 99,99 фонових програм можуть пройти за допомогою цієї парадигми. Фронтальні програми потребують реактивного коду, без сумнівів, і це завжди було способом.
Так, код може бути асинхронним, неблокуючим та заснованим на подіях.
Найголовніше у програмуванні - це переконатися, що ваш код працює та реагує протягом прийнятного часу. Дотримуйтесь цього ключового принципу, і ви не можете помилитися.