Асинхронне програмування
Ця стаття не містить посилань на джерела. (березень 2021) |
Цю статтю треба вікіфікувати для відповідності стандартам якості Вікіпедії. (березень 2021) |
Асинхронність — це процес обробки введення/виводу, що дозволяє продовжити обробку інших завдань, не чекаючи завершення попереднього завдання.
Комп'ютерні програми часто мають справу з тривалими процесами. Наприклад, отримання даних з бази даних або виконання складних обчислень. Поки виконується одна операція, можна було б завершити ще кілька. А бездіяльність призводить до зниження продуктивності. Асинхронне програмування збільшує ефективність, тому що не дозволяє блокувати основний потік виконання.
Асинхронне програмування[ред. | ред. код]
У синхронному коді кожна операція чекає закінчення попередньої. Тому вся програма може «зависнути», якщо одна з команд виконується дуже довго.
Асинхронний код прибирає операцію, яка блокує основний потік програми, так що основний потік не блокується, і програма може виконувати інші операції.
Асинхронне програмування успішно вирішує безліч завдань. Одна з найважливіших — користувач може взаємодіяти з програмою, поки виконується інше завдання.
Візьмемо для прикладу додаток, який підбирає серіали за зазначеними критеріями. Після того, як користувач обрав параметри, по яким буде відбуватися пошук, програма відправляє запит на сервер. А там здійснюється пошук вказаних фільмів. Обробка може тривати доволі тривалий час. Якщо додаток працює синхронно, то користувач не зможе взаємодіяти зі сторінкою, поки не прийде результат.
В цьому випадку головний потік виконання поділяється на дві гілки. Одна з них продовжує займатися інтерфейсом, а інша виконує запит.
Коли мова заходить про асинхронність, слід розглянути також такі поняття: конкурентність, паралелізм і багатопотоковість. Всі вони пов'язані з одночасним виконанням завдань, проте це не одне і те ж.
Конкурентність[ред. | ред. код]
Поняття конкурентного виконання найзагальніше. Воно буквально означає, що безліч завдань вирішуються в один час. Можна сказати, що в програмі є кілька логічних потоків ‒ по одному на кожну задачу.
Потоки можна опрацьовувати одночасно фізично, проте це не обов'язково.
Завдання при цьому не пов'язані одне з одним. Отже, не має значення, яке завдання завершиться раніше, а яке пізніше.
Паралелізм[ред. | ред. код]
Паралельне виконання зазвичай використовується для поділу одного завдання на частини, щоб пришвидшити обчислення.
Наприклад, потрібно зробити кольорове зображення чорно-білим. Обробка верхньої половини не відрізняється від обробки нижньої. Отже, можна розділити цю задачу на дві частини і роздати їх різним потокам, щоб пришвидшити виконання в два рази.
Наявність двох фізичних потоків тут принципово важливо, так як на комп'ютері з одним процесорним ядром такий прийом провести неможливо.
Багатопотоковість[ред. | ред. код]
Тут потік є абстракцією, під якою може ховатися і окреме ядро процесора, і віртуальне ядро. Деякі мови навіть мають власні об'єкти потоків. Таким чином, ця концепція може мати різну реалізацію.
Шаблони асинхронності[ред. | ред. код]
Можна виділити три найпопулярніші схеми асинхронних запитів.
Послідовне виконання[ред. | ред. код]
Використовується для пов'язаних завдань, які потрібно запускати один за одним. Наприклад, перший запит отримує назви фільмів, а другий ‒ інформацію про них.
Паралельне виконання[ред. | ред. код]
Застосовується для вирішення незалежних завдань, коли важливо, щоб виконалися всі запити. Наприклад, дані вебсторінки вантажаться з трьох серверів, а після цього починається рендеринг.
Конкурентне виконання[ред. | ред. код]
Використовується для вирішення незалежних завдань, коли важливо, щоб виконався хоча б один запит. Наприклад, відправлення ідентичних запитів на різні сервери.
На цю статтю не посилаються інші статті Вікіпедії. Будь ласка розставте посилання відповідно до прийнятих рекомендацій. |