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-связанных задач без накладных расходов на создание множества потоков или процессов.