Как избежать блокировки асинхронности в случае CPU-bound задач
Python
Middle
Без компании
Как избежать блокировки асинхронности в случае CPU-bound задач
Ответы
Для CPU-bound задач в асинхронном коде используйте `ProcessPoolExecutor` из `concurrent.futures`, так как asyncio плохо подходит для CPU-intensive операций. Пример:
```
import asyncio
from concurrent.futures import ProcessPoolExecutor
def cpu_intensive_task(x):
# Тяжелые вычисления
return x * x
async def main():
with ProcessPoolExecutor() as pool:
result = await asyncio.get_event_loop().run_in_executor(
pool,
cpu_intensive_task,
10
)
print(result)
asyncio.run(main())
```
Ключевые моменты:
- CPU-bound задачи выполняются в отдельных процессах
- Основной event loop не блокируется
- Для IO-bound задач лучше использовать чистый asyncio
- Для Python 3.9+ можно использовать `asyncio.to_thread()` для легких задач