← Назад к вопросам
Какие знаешь названия асинхронных сущностей в Python?
2.0 Middle🔥 171 комментариев
#Асинхронность и многопоточность
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Асинхронные сущности в Python
Асинхронное программирование в Python основано на концепции управления потоком выполнения без блокировки. Существует множество сущностей для работы с асинхронным кодом.
1. Coroutine (Корутина)
# Корутина — функция, которая может приостановить выполнение
import asyncio
async def my_coroutine():
"""Это корутина"""
await asyncio.sleep(1)
return "Done"
# Создание корутины
coro = my_coroutine()
print(type(coro)) # <class 'coroutine'>
# Выполнение
result = asyncio.run(my_coroutine())
print(result) # Done
# ✅ Плюсы:
# - Основная единица асинхронного кода
# - Может быть приостановлена и возобновлена
# - Эффективнее потоков
# ❌ Минусы:
# - Требует event loop
# - Нельзя запустить как обычную функцию
2. Task (Задача)
# Task — обёртка над корутиной, добавляет управление
import asyncio
async def fetch_data(url: str):
await asyncio.sleep(1)
return f"Data from {url}"
async def main():
# Создание task'а
task1 = asyncio.create_task(fetch_data("http://api.example.com"))
task2 = asyncio.create_task(fetch_data("http://api2.example.com"))
# Ожидание выполнения
results = await asyncio.gather(task1, task2)
print(results)
asyncio.run(main())
# Отличие от coroutine:
# - Task планируется в event loop сразу
# - Можно отменить (cancel)
# - Можно получить состояние (done, cancelled)
# ✅ Плюсы:
# - Параллельное выполнение
# - Управление жизненным циклом
# - Можно отменить
3. Future (Будущее)
# Future — результат, который будет доступен в будущем
import asyncio
async def main():
loop = asyncio.get_event_loop()
# Создание Future
future = loop.create_future()
# Обработка в фоне
async def set_future_result():
await asyncio.sleep(1)
future.set_result("Result")
asyncio.create_task(set_future_result())
# Ожидание результата
result = await future
print(result) # Result
asyncio.run(main())
# ✅ Плюсы:
# - Синхронизация между корутинами
# - Позволяет встроить асинхронный код в синхронный
# ❌ Минусы:
# - Низкоуровневая абстракция
# - Task'и обычно удобнее
4. Event Loop (Цикл событий)
# Event Loop — сердце асинхронной программы
import asyncio
async def greet(name):
print(f"Hello, {name}!")
await asyncio.sleep(1)
print(f"Goodbye, {name}!")
# Способ 1: asyncio.run() (Python 3.7+)
asyncio.run(greet("Alice"))
# Способ 2: получить текущий loop
loop = asyncio.get_event_loop()
loop.run_until_complete(greet("Bob"))
# Способ 3: manual loop (редко)
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
loop.run_until_complete(greet("Charlie"))
finally:
loop.close()
# Event Loop отвечает за:
# - Планирование корутин
# - Обработку I/O операций
# - Выполнение callbacks
5. Awaitable (Ожидаемое)
# Awaitable — объект, который можно ожидать (await)
import asyncio
from typing import Awaitable
# Корутины
async def my_coro() -> Awaitable[str]:
return "result"
# Task'и
task: Awaitable[str] = asyncio.create_task(my_coro())
# Future'ы
future: Awaitable[str] = asyncio.Future()
# Любой объект с методом __await__
class MyAwaitable:
def __await__(self):
yield
return "custom awaitable"
async def use_awaitable():
result = await MyAwaitable()
print(result) # custom awaitable
# Всё, что можно использовать с await
6. Iterator и AsyncIterator
# Обычный iterator
def sync_generator():
for i in range(3):
yield i
# Асинхронный iterator
async def async_generator():
for i in range(3):
await asyncio.sleep(0.1)
yield i
async def main():
# Обычный
for value in sync_generator():
print(f"Sync: {value}")
# Асинхронный
async for value in async_generator():
print(f"Async: {value}")
asyncio.run(main())
# ✅ AsyncIterator удобен для:
# - Потоков данных
# - Чтения файлов асинхронно
# - WebSocket'ов
7. Context Manager и AsyncContextManager
# Асинхронный контекстный менеджер
import asyncio
class AsyncConnection:
async def __aenter__(self):
print("Connecting...")
await asyncio.sleep(0.5)
print("Connected")
return self
async def __aexit__(self, exc_type, exc_val, exc_tb):
print("Disconnecting...")
await asyncio.sleep(0.5)
print("Disconnected")
async def query(self, sql: str):
await asyncio.sleep(0.1)
return f"Result of {sql}"
async def main():
async with AsyncConnection() as conn:
result = await conn.query("SELECT * FROM users")
print(result)
asyncio.run(main())
# ✅ Для:
# - Управления ресурсами
# - Асинхронных подключений к БД
# - HTTP клиентов
8. Callback (Обратный вызов)
# Callbacks в асинхронном коде
import asyncio
async def async_operation():
await asyncio.sleep(1)
return "Result"
def on_done(task):
"""Callback когда task завершился"""
result = task.result()
print(f"Task done with result: {result}")
async def main():
task = asyncio.create_task(async_operation())
task.add_done_callback(on_done) # Добавить callback
await task
asyncio.run(main())
# ✅ Для:
# - Реакции на завершение task'а
# - Обработки результатов
# ❌ Минусы:
# - Menos readable чем await
# - Сложнее обработка ошибок
9. Lock (Блокировка) и Semaphore
# Асинхронные примитивы синхронизации
import asyncio
# Lock — взаимное исключение
lock = asyncio.Lock()
async def critical_section():
async with lock:
print("In critical section")
await asyncio.sleep(1)
print("Leaving critical section")
async def main():
await asyncio.gather(
critical_section(),
critical_section(),
critical_section(),
)
asyncio.run(main())
# Semaphore — ограничение количества
sem = asyncio.Semaphore(2) # Макс 2 одновременно
async def limited_task(id):
async with sem:
print(f"Task {id} acquired semaphore")
await asyncio.sleep(1)
print(f"Task {id} released semaphore")
# ✅ Для:
# - Rate limiting
# - Защиты критических секций
# - Ограничения нагрузки
10. Event (Событие)
# Event — сигнал между корутинами
import asyncio
event = asyncio.Event()
async def waiter():
print("Waiter: waiting for event")
await event.wait()
print("Waiter: event received!")
async def setter():
await asyncio.sleep(2)
print("Setter: setting event")
event.set()
async def main():
await asyncio.gather(
waiter(),
waiter(),
setter(),
)
asyncio.run(main())
# ✅ Для:
# - Синхронизации
# - Оповещения группы корутин
11. Condition (Условие)
# Condition — Lock + Event
import asyncio
condition = asyncio.Condition()
data = None
async def consumer():
async with condition:
await condition.wait()
print(f"Consumer got data: {data}")
async def producer():
global data
await asyncio.sleep(1)
async with condition:
data = "Important data"
condition.notify() # Разбудить одного
# или condition.notify_all() # Разбудить всех
async def main():
await asyncio.gather(
consumer(),
consumer(),
producer(),
)
asyncio.run(main())
12. Queue (Очередь)
# AsyncQueue — для передачи данных между корутинами
import asyncio
queue = asyncio.Queue(maxsize=3)
async def producer():
for i in range(5):
await queue.put(f"Item {i}")
print(f"Produced item {i}")
await asyncio.sleep(0.5)
async def consumer():
while True:
item = await queue.get()
print(f"Consumed {item}")
await asyncio.sleep(1)
queue.task_done()
async def main():
await asyncio.gather(
producer(),
consumer(),
consumer(),
)
asyncio.run(main())
13. Gather и Wait
# Ожидание нескольких корутин
import asyncio
async def task(name, delay):
await asyncio.sleep(delay)
return f"Task {name} done"
async def main():
# gather — ждёт всех, результаты в порядке
results = await asyncio.gather(
task("A", 1),
task("B", 2),
task("C", 1),
)
print(results)
# wait — больше контроля
tasks = [
asyncio.create_task(task("X", 1)),
asyncio.create_task(task("Y", 2)),
]
done, pending = await asyncio.wait(
tasks,
timeout=1.5, # Timeout
)
print(f"Done: {done}, Pending: {pending}")
asyncio.run(main())
Сравнение асинхронных сущностей
Сущность | Использование
====================================
Coroutine | Базовая единица асинхронного кода
Task | Управление и отмена корутин
Future | Синхронизация результатов
Event Loop | Планирование и выполнение
Lock/Semaphore | Синхронизация доступа
Event | Сигнальное оповещение
Queue | Передача данных
AsyncIterator | Потоки данных
AsyncContextManager| Управление ресурсами
Итоги
Асинхронные сущности в Python:
- Coroutine — основная единица
- Task — управляемая корутина
- Future — результат в будущем
- Event Loop — планировщик
- Lock/Semaphore — синхронизация
- Event/Condition — сигналы
- Queue — передача данных
- AsyncIterator/AsyncContextManager — итерация и ресурсы