Перейти до основного контенту

Асинхронність у Python: принципи та приклади роботи

9 хв читання
1457 переглядів

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

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

В Python існує кілька способів реалізації асинхронності. Один з них-використання асинхронних функцій і корутинів. Асинхронні функції дозволяють виконувати код паралельно, а корутини дозволяють призупиняти та відновлювати виконання коду на вимогу.

Що таке асинхронність?

У контексті Python асинхронність стала особливо актуальною з появою асинхронної бібліотеки asyncio. Вона надає потужні інструменти для написання асинхронного коду, який може бути розгорнутий на великій кількості операційних систем і платформ.

При використанні асинхронності в Python, можна створювати співпрограми (coroutines), які можуть припинятися і відновлюватися в процесі виконання. Це дозволяє паралельно здійснювати кілька викликів функцій або методів, не блокуючи основний потік виконання.

Асинхронний код в Python заснований на принципі подієвого циклу (event loop). Він відповідає за управління завданнями та їх виконання в асинхронному середовищі. Коли одна операція блокується, цикл подій перемикає контекст на інше завдання, яке виконується паралельно. Це забезпечує оптимальне використання ресурсів і прискорює час виконання.

Основні принципи асинхронності

Основні принципи асинхронної роботи:

  1. Неблокуючі операції: асинхронність можлива завдяки тому, що операції не блокують виконання всієї програми, а передають управління іншим завданням.
  2. Корутини: центральним поняттям в асинхронному програмуванні є корутини – функції, які можуть припиняти своє виконання і передавати управління іншим корутинам. Це дозволяє ефективно використовувати ресурси і уникнути блокувань.
  3. Подієвий цикл: основний компонент асинхронної програми-подієвий цикл, який управляє виконанням завдань і обробляє події. Він стежить за виникненням нових операцій і перемикає контекст виконання між корутинами.

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

Асинхронність у Python

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

Основним компонентом асинхронності в Python є концепція корутин, які дозволяють запускати функції, не блокуючи основний потік виконання. Замість цього, функція може "припинятися" на певний момент часу і поступатися виконання інших завдань. Такі функції називаються асинхронними.

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

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

Переваги використання асинхронних операцій у Python

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

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

Ще однією перевагою використання асинхронності є можливість легко обробляти велику кількість одночасних запитів. Завдяки механізму корутин, Python дозволяє ефективно працювати з великою кількістю клієнтів, забезпечуючи низьку затримку і високу пропускну здатність.

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

Всі ці переваги роблять асинхронні операції важливим інструментом, який може підвищити продуктивність і ефективність роботи Python-додатків.

Приклади роботи з асинхронними функціями

Асинхронні функції у Python дозволяють виконувати кілька завдань одночасно, підвищуючи продуктивність програми. Розглянемо кілька прикладів роботи з асинхронними функціями.

Приклад 1: Запуск декількох завдань паралельно.

import asyncioasync def task1():await asyncio.sleep(1)print("Задача 1 выполнена")async def task2():await asyncio.sleep(2)print("Задача 2 выполнена")async def main():await asyncio.gather(task1(), task2())asyncio.run(main())

У цьому прикладі ми створюємо дві асинхронні функції, task1 () і task2 (), які виконуються паралельно за допомогою функції asyncio.gather(). Завдання 1 виконується протягом 1 секунди, а завдання 2 - 2 секунди. Результат виконання:

Задача 1 выполненаЗадача 2 выполнена

Приклад 2: Завдання з очікуванням результату.

import asyncioimport randomasync def get_data():await asyncio.sleep(2)return random.randint(1, 10)async def process_data():data = await get_data()await asyncio.sleep(1)print(f"Обработано число: ")async def main():await process_data()asyncio.run(main())

У цьому прикладі ми створюємо асинхронну функцію get_data (), яка повертає випадкове число після затримки 2 секунди. Потім, це число передається в функцію process_data (), яка також має затримку в 1 секунду. Результат виконання:

Обработано число: [рандомное число]

Дані приклади демонструють прості принципи роботи з асинхронними функціями в Python. Важливо вміти правильно використовувати асинхронність для оптимізації процесів і підвищення продуктивності додатків.

Приклад 1: асинхронне завантаження файлів

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

Нижче наведено приклад коду, який демонструє асинхронне завантаження файлів за допомогою aiohttp:

import asyncio import aiohttp async def download_file(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: data = await response.read () # збереження файлу на диск або подальша обробка async def main (): urls = [ 'https://example.com/file1.txt', 'https://example.com/file2.txt', 'https://example.com/file3.txt', ] tasks = [] for url in urls: tasks.append(asyncio.create_task(download_file(url))) await asyncio.gather(*tasks) asyncio.run(main())

В даному прикладі функція download_file виконує асинхронну завантаження файлу по заданому URL. Функція main ініціює асинхронне виконання декількох завдань download_file, використовуючи бібліотеку asyncio.

Для запуску програми використовується функція asyncio.run (main ()), який запускає цикл подій і чекає завершення всіх асинхронних завдань.

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

Переваги асинхронного завантаження файлів:

  • Збільшення продуктивності програми
  • Скорочення часу відповіді
  • Можливість паралельного завантаження декількох файлів
  • Управління іншими завданнями під час виконання запитів

Приклад 2: асинхронний Веб-скрапінг

Для прикладу розглянемо сценарій, в якому необхідно зібрати інформацію про заголовки і вміст декількох веб-сторінок з використанням асинхронних запитів. Для цього створимо функцію get_data, яка буде обробляти кожну сторінку:

ЗаголовокВміст
Заголовок 1Вміст 1
Заголовок 2Вміст 2
Заголовок 3Вміст 3

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

import aiohttpimport asyncioasync def get_data(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:data = await response.text()# обработка данныхurls = ['https://example.com/page1','https://example.com/page2','https://example.com/page3']loop = asyncio.get_event_loop()tasks = [get_data(url) for url in urls]loop.run_until_complete(asyncio.gather(*tasks))

В даному прикладі ми створюємо список URL-адрес, до яких будемо відправляти запити. Потім ми створюємо цикл подій asyncio та список завдань, де кожне завдання є викликом функції get_data з передачею URL-адреси як аргументом. Потім ми запускаємо цикл подій до завершення виконання всіх завдань, за допомогою виклику функції run_until_complete і утиліти gather .

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