Параллельное выполнение¶
FastHTTP автоматически выполняет все зарегистрированные запросы параллельно.
Как это работает¶
При вызове app.run(), FastHTTP:
- Собирает все зарегистрированные маршруты
- Создает асинхронную задачу для каждого маршрута
- Выполняет все задачи параллельно с помощью
asyncio.gather() - Ожидает завершения всех запросов
- Логирует результаты
Пример¶
from fasthttp import FastHTTP
from fasthttp.response import Response
app = FastHTTP()
@app.get(url="https://jsonplaceholder.typicode.com/posts/1")
async def get_post(resp: Response) -> dict:
return resp.json()
@app.get(url="https://jsonplaceholder.typicode.com/users/1")
async def get_user(resp: Response) -> dict:
return resp.json()
@app.get(url="https://jsonplaceholder.typicode.com/comments/1")
async def get_comment(resp: Response) -> dict:
return resp.json()
if __name__ == "__main__":
# Все три запроса выполнятся параллельно
app.run()
Сравнение производительности¶
Последовательное выполнение¶
Параллельное выполнение (FastHTTP)¶
Вывод:
INFO | fasthttp | FastHTTP started
INFO | fasthttp | Sending 3 requests
INFO | fasthttp | GET https://jsonplaceholder.typicode.com/posts/1 200 150ms
INFO | fasthttp | GET https://jsonplaceholder.typicode.com/users/1 200 120ms
INFO | fasthttp | GET https://jsonplaceholder.typicode.com/comments/1 200 110ms
INFO | fasthttp | Done in 0.15s
Ограничение параллелизма¶
По умолчанию все маршруты выполняются полностью параллельно. Параметр concurrency ограничивает количество одновременно выполняемых запросов.
Это полезно когда:
- У целевого API есть rate limit (например, 5 req/s)
- Нужно не перегружать сервер при 100+ одновременных соединениях
- Требуется предсказуемое потребление ресурсов
Пример¶
from fasthttp import FastHTTP
from fasthttp.response import Response
# Не более 3 запросов одновременно
app = FastHTTP(concurrency=3)
@app.get(url="https://api.example.com/items/1")
async def item_1(resp: Response) -> dict:
return resp.json()
@app.get(url="https://api.example.com/items/2")
async def item_2(resp: Response) -> dict:
return resp.json()
@app.get(url="https://api.example.com/items/3")
async def item_3(resp: Response) -> dict:
return resp.json()
@app.get(url="https://api.example.com/items/4")
async def item_4(resp: Response) -> dict:
return resp.json()
@app.get(url="https://api.example.com/items/5")
async def item_5(resp: Response) -> dict:
return resp.json()
if __name__ == "__main__":
# Первые 3 стартуют сразу, остальные 2 ждут свободного слота
app.run()
None (по умолчанию) — без лимита, все маршруты параллельно.
Когда это важно¶
Параллельное выполнение особенно полезно при:
- Множественных вызовах API
- Получении данных из нескольких сервисов
- Обработке нескольких ресурсов
Чем больше запросов, тем больше времени экономится.