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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Паралелізм[ред. | ред. код]

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

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

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

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

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

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

Шаблони асинхронності[ред. | ред. код]

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

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

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

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

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

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

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

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