Как asyncio позволяет допускать код с блокирующими командами CPU
Python
Middle
Без компании
Как asyncio позволяет допускать код с блокирующими командами CPU
Ответы
Asyncio работает на основе кооперативной многозадачности, где корутины добровольно отдают управление через `await`. Однако, если внутри корутины есть синхронный CPU-bound код (например, сложные вычисления), он блокирует event loop, так как не отдает управление.
**Проблема:**
```
async def bad_example():
# Блокирует event loop
result = sum(i*i for i in range(10**7))
```
**Решение:**
- **Вынос в отдельный поток/процесс** через `loop.run_in_executor()`:
```
async def good_example():
loop = asyncio.get_event_loop()
result = await loop.run_in_executor(None, lambda: sum(i*i for i in range(10**7)))
```
- **Использование специализированных асинхронных библиотек** (например, `aiohttp` вместо `requests`)
Ключевое правило: asyncio подходит для I/O-bound задач, а CPU-bound операции нужно выносить в executor или использовать multiprocessing.