Асинхронные веб-фреймворки и блокирующий код
Python
Senior
Яндекс
Что произойдёт, если внутри обработчика FastAPI/Starlette, объявленного как `async def`, вызвать тяжёлую синхронную функцию (CPU-bound или блокирующий I/O)? Как это правильно исправить?
Ответы
Блокирующий код в async handler
Если внутри `async` обработчика вызвать блокирующую функцию, event loop будет заблокирован на время её выполнения. Это приведёт к задержкам для всех запросов, обслуживаемых этим воркером.
Исправление:
- вынести CPU-bound в отдельный процесс (`ProcessPoolExecutor`, Celery и т.п.);
- блокирующий I/O запускать через `run_in_executor`:
```python
import asyncio
async def handler():
loop = asyncio.get_running_loop()
result = await loop.run_in_executor(None, blocking_func)
return result
```