Sobes.tech
Junior
98
questionbank

Что такое асинхронное программирование?

Ответ от нейросети

sobes.tech AI

Асинхронное программирование позволяет выполнять несколько задач, не блокируя основной поток выполнения. Главная особенность в том, что операции ввода-вывода (чтение файла, сетевые запросы) не заставляют программу ждать их завершения. Вместо этого программа переключается на выполнение другой задачи, пока первая операция ожидает результата.

Основные компоненты в Python:

  • coroutine (корутина): Функция, которая может быть приостановлена и возобновлена. Объявляется с помощью async def.
  • event loop (цикл событий): Управляет выполнением корутин, планирует их, переключается между ними при возникновении ожиданий.
  • await: Ключевое слово для приостановки выполнения корутины до завершения ожидаемой операции (например, другой корутины или I/O). Используется только внутри async def.

Пример:

import asyncio

async def worker(name):
    print(f"Worker {name} starts")
    await asyncio.sleep(1)  # Имитация долгой операции I/O
    print(f"Worker {name} finishes")

async def main():
    # Запускаем две корутины конкурентно
    await asyncio.gather(worker("A"), worker("B"))

# Запуск главного корутины
if __name__ == "__main__":
    asyncio.run(main())

Сравнение с многопоточностью и многопроцессностью:

Характеристика Асинхронное I/O (Asyncio) Многопоточность (Threading) Многопроцессность (Multiprocessing)
Параллелизм Конкурентность (один поток) Параллелизм (несколько потоков в одном процессе) Параллелизм (несколько процессов)
Переключение Кооперативное (явное yield/await) Преемственное (ОС) Преемственное (ОС)
Использование I/O-связанные задачи I/O-связанные задачи CPU-связанные задачи
Накладные расходы Низкие Средние Высокие
GIL (Global Interpreter Lock) Не влияет на I/O операции, но блокирует CPU-bound в одном потоке Может блокировать CPU-bound Обходит GIL, каждый процесс имеет свой интерпретатор

Основное преимущество асинхронного программирования в Python — эффективное использование ресурсов при большом количестве I/O-связанных задач без накладных расходов на создание множества потоков или процессов.