Асинхронне програмування

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

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

Асинхронне програмування ред.

У синхронному коді кожна операція чекає закінчення попередньої. Тому вся програма може «зависнути», якщо одна з команд виконується дуже довго.

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

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

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

В цьому випадку головний потік виконання поділяється на дві гілки. Одна з них продовжує займатися інтерфейсом, а інша виконує запит.

 
Приклад роботи асинхронного та синхронного коду

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

Конкурентність ред.

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

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

Завдання при цьому не пов'язані одне з одним. Отже, не має значення, яке завдання завершиться раніше, а яке пізніше.

Паралелізм ред.

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

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

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

Багатопотоковість ред.

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

 
Принцип роботи конкуренції та паралелізму

Шаблони асинхронності ред.

Можна виділити три найпопулярніші схеми асинхронних запитів.

 
Графічне зображення роботи трьох типів асинхронних запитів

Послідовне виконання ред.

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

Паралельне виконання ред.

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

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

Використовується для вирішення незалежних завдань, коли важливо, щоб виконався хоча б один запит. Наприклад, відправлення ідентичних запитів на різні сервери.