FastAPI + Uvicorn = Вражаюча швидкість: Технології, що стоять за цією популярністю

pic

Що таке Uvicorn?

pic

Відповідь: Uvicorn — це дуже швидкий сервер ASGI (Asynchronous Server Gateway Interface), побудований на uvloop та httptools. Це легкий і ефективний веб-сервер, розроблений на основі asyncio.
Uvicorn був спочатку спроектований для досягнення двох цілей:

  • Реалізувати надзвичайно швидкий сервер asyncio, використовуючи uvloop та httptools.
  • Реалізувати мінімальний інтерфейс додатка, заснований на ASGI. В даний час він підтримує http, вебсокети, Pub/Sub трансляції і може бути розширений для інших протоколів і типів повідомлень. Офіційний сайт: uvicorn (https://uvicorn.org/)

Що таке uvloop та httptools?

Відповідь: uvloop використовується для заміни циклу подій в стандартній бібліотеці asyncio. Він реалізований з використанням Cython і дуже швидкий, що може збільшити швидкість asyncio на 2-4 рази. Я припускаю, що ви знайомі з asyncio, оскільки це необхідно для написання асинхронного коду.
httptools — це Python-реалізація парсера HTTP з Node.js.

Що таке сервер ASGI?

Відповідь: ASGI, Asynchronous Server Gateway Interface, є стандартним інтерфейсом між сервісами мережевих протоколів та Python-додатками. Він може обробляти кілька типових протоколів, включаючи HTTP, HTTP2 та WebSocket.
Протокол ASGI: https://asgi.readthedocs.io/en/latest/specs/main.html

Коротко про Uvicorn

Відповідь: На даний момент Python не має асинхронного інтерфейсу шлюзу протоколів. Поява ASGI заповнює цю прогалину. Тепер ми можемо використовувати загальний стандарт для реалізації інструментів для всіх асинхронних фреймворків. ASGI допомагає Python конкурувати з Node.JS та Golang у веб-фреймворках, намагаючись досягти високої продуктивності для задач, що вимагають інтенсивних операцій вводу-виводу. ASGI підтримує HTTP2 і WebSockets, чого не підтримує WSGI.
Наразі Uvicorn підтримує HTTP1.1 та WebSocket, і планує підтримувати HTTP2.

Використання Uvicorn

  • Встановлення
    Виконайте команду pip install uvicorn
  • Створіть новий файл example.py
async def app(scope, receive, send):  
 assert scope['type'] == 'http'  
 await send({  
 'type': 'http.response.start',  
 'status': 200,  
 'headers': [  
 [b'content-type', b'text/plain'],  
 ]  
 })  
 await send({  
 'type': 'http.response.body',  
 'body': b'Hello, world!',  
 })
  • Запустіть uvicorn з командного рядка
    Виконайте команду uvicorn example:app
  • Запустіть у вигляді скрипта
import uvicorn  

async def app(scope, receive, send):  
 ...  
if __name__ == "__main__":  
 uvicorn.run("example:app", host="127.0.0.1", port=8000, log_level="info")

Uvicorn підтримує кілька команд, які можна переглянути за допомогою uvicorn --help.

➜ ~ uvicorn --help  
Usage: uvicorn [OPTIONS] APP  

Options:  
 --host TEXT Bind socket to this host. [default:  
 127.0.0.1]  
 --port INTEGER Bind socket to this port. If 0, an available  
 port will be picked. [default: 8000]  
 --uds TEXT Bind to a UNIX domain socket.  
 --fd INTEGER Bind to socket from this file descriptor.  
 --reload Enable auto-reload.  
 --reload-dir PATH Set reload directories explicitly, instead  
 of using the current working directory.  
 --reload-include TEXT Set glob patterns to include while watching  
 for files. Includes '*.py' by default; these  
 defaults can be overridden with `--reload-  
 exclude`. This option has no effect unless  
 watchfiles is installed.  
 --reload-exclude TEXT Set glob patterns to exclude while watching  
 for files. Includes '.*,.py[cod],.sw.*,  
 ~*' by default; these defaults can be  
 overridden with `--reload-include`. This  
 option has no effect unless watchfiles is  
 installed.  
 --reload-delay FLOAT Delay between previous and next check if  
 application needs to be. Defaults to 0.25s.

[default: 0.25]  
 --workers INTEGER Кількість робочих процесів. За замовчуванням значення візьметься з змінної середовища  
 $WEB_CONCURRENCY, або 1. Не підтримується з параметром --reload.  
 --loop [auto|asyncio|uvloop] Реалізація циклу подій. [default: auto]  
 --http [auto|h11|httptools] Реалізація HTTP протоколу. [default:  
 auto]  
 --ws [auto|none|websockets|wsproto]  
 Реалізація WebSocket протоколу.  
 [default: auto]  
 --ws-max-size INTEGER Максимальний розмір повідомлення WebSocket в байтах  
 [default: 16777216]  
 --ws-max-queue INTEGER Максимальна довжина черги повідомлень WebSocket. [default: 32]  
 --ws-ping-interval FLOAT Інтервал пінгу WebSocket в секундах.  
 [default: 20.0]  
 --ws-ping-timeout FLOAT Тайм-аут пінгу WebSocket в секундах.  
 [default: 20.0]  
 --ws-per-message-deflate BOOLEAN  
 Стиснення per-message-deflate WebSocket  
 [default: True]  
 --lifespan [auto|on|off] Реалізація lifespan. [default: auto]  
 --interface [auto|asgi3|asgi2|wsgi]  
 Вибір інтерфейсу ASGI3, ASGI2 або WSGI для додатка. [default: auto]  
 --env-file PATH Файл конфігурації середовища.  
 --log-config PATH Файл конфігурації журналу. Підтримувані  
 формати: .ini, .json, .yaml.  
 --log-level [critical|error|warning|info|debug|trace]  
 Рівень журналу. [default: info]  
 --access-log / --no-access-log Увімкнути/вимкнути журнал доступу.  
 --use-colors / --no-use-colors Увімкнути/вимкнути кольоровий журнал.  
 --proxy-headers / --no-proxy-headers  
 Увімкнути/вимкнути X-Forwarded-Proto,  
 X-Forwarded-For, X-Forwarded-Port для  
 заповнення інформації про віддалену адресу.  
 --server-header / --no-server-header  
 Увімкнути/вимкнути стандартний заголовок Server.  
 --date-header / --no-date-header  
 Увімкнути/вимкнути стандартний заголовок Date.  
 --forwarded-allow-ips TEXT Список довірених IP-адрес для проксі-заголовків, розділений комами. За замовчуванням використовується змінна середовища  
 $FORWARDED_ALLOW_IPS, або '127.0.0.1'.  
 --root-path TEXT Встановіть 'root_path' ASGI для додатків  
 розміщених за певним URL шляхом.  
 --limit-concurrency INTEGER Максимальна кількість одночасних підключень або  
 завдань, які дозволяється, перш ніж видавати HTTP 503  
 відповіді.  
 --backlog INTEGER Максимальна кількість підключень, що зберігаються в черзі  
 --limit-max-requests INTEGER Максимальна кількість запитів для обробки до завершення процесу.  
 --timeout-keep-alive INTEGER Закрити з’єднання Keep-Alive, якщо нові дані не отримано протягом цього тайм-ауту. [default:  
 5]  
 --timeout-graceful-shutdown INTEGER  
 Максимальна кількість секунд, щоб почекати для  
 плавного завершення.  
 --ssl-keyfile TEXT Файл SSL ключа  
 --ssl-certfile TEXT Файл SSL сертифіката  
 --ssl-keyfile-password TEXT Пароль до SSL ключа  
 --ssl-version INTEGER Версія SSL для використання (див. модуль stdlib ssl)  
 [default: 17]  
 --ssl-cert-reqs INTEGER Чи потрібен сертифікат клієнта (див. модуль stdlib ssl) [default: 0]  
 --ssl-ca-certs TEXT Файл сертифікатів CA  
 --ssl-ciphers TEXT Шифри для використання (див. модуль stdlib ssl)  
 [default: TLSv1]  
 --header TEXT Вказати власні заголовки HTTP відповіді  
 як пару Назва:Значення  
 --version Показати версію uvicorn і вийти.  
 --app-dir TEXT Шукати APP у зазначеному каталозі, додавши це до PYTHONPATH. За замовчуванням використовується  
 поточний робочий каталог.  
 --h11-max-incomplete-event-size INTEGER  
 Для h11, максимальна кількість байтів для  
 буферизації неповного події.  
 --factory Розглядати APP як фабрику додатків, тобто як  
 () ->  викликається.  
 --help Показати це повідомлення і вийти.  
➜ ~

Конфігурація та серверні екземпляри

Для кращого контролю за конфігурацією та життєвим циклом сервера використовуйте uvicorn.Config та uvicorn.Server:

import uvicorn  

async def app(scope, receive, send):  
 ...


if __name__ == "__main__":  
 config = uvicorn.Config("main:app", port=5000, log_level="info")  
 server = uvicorn.Server(config)  
 server.run()

Якщо ви хочете запустити Uvicorn з вже працюючого асинхронного середовища, використовуйте замість цього uvicorn.Server.serve():

import asyncio  
import uvicorn  

async def app(scope, receive, send):  
 ...  
async def main():  
 config = uvicorn.Config("main:app", port=5000, log_level="info")  
 server = uvicorn.Server(config)  
 await server.serve()  
if __name__ == "__main__":  
 asyncio.run(main())

Запуск проекту FastAPI з Uvicorn

import uvicorn  
from fastapi import FastAPI  

app = FastAPI()  
@app.get("/")  
async def root():  
 return {"message": "Hello World"}  
if __name__ == '__main__':  
 uvicorn.run(app=app)

Чому FastAPI використовує Uvicorn?

FastAPI — це сучасний, високопродуктивний веб-фреймворк. Він використовує асинхронні можливості Python для покращення продуктивності веб-додатків. Uvicorn, у свою чергу, є високопродуктивним сервером ASGI, реалізованим за допомогою uvloop та httptools, який може обробляти HTTP запити асинхронно. FastAPI використовує Uvicorn як свій стандартний веб-сервер, оскільки він дуже швидкий, надійний та простий у використанні. Він може залишатися стабільним та ефективним при обробці великої кількості одночасних підключень. Крім того, Uvicorn підтримує нові функції, такі як WebSocket та HTTP/2, що відповідає сучасній філософії веб-розробки, яку підтримує FastAPI. Тому використання Uvicorn як веб-сервера для FastAPI — це чудовий вибір.

Leapcell: Платформа нового покоління для хостингу веб-сайтів, асинхронних завдань та Redis

[pic

Нарешті, хочу представити платформу, яка найкраще підходить для розгортання FastAPI сервісів: Leapcell.

Leapcell має наступні функції:

1. Підтримка кількох мов
Розробка на JavaScript, Python, Go або Rust.

2. Безкоштовне розгортання необмеженої кількості проєктів
Платіть тільки за використання — без запитів, без платіжних зобов'язань.

3. Неперевершена економія витрат

Оплата за використання без платних простоїв.

Приклад: $25 підтримує 6.94 млн запитів при середньому часі відповіді 60 мс.

4. Простота використання для розробників

Інтуїтивно зрозумілий інтерфейс для легкого налаштування.

Повністю автоматизовані CI/CD пайплайни та інтеграція з GitOps.

Аналітика та журнали в реальному часі для корисних відомостей.

5. Легке масштабування та висока продуктивність
Автоматичне масштабування для зручної обробки високої кількості одночасних підключень.

Відсутність операційних витрат — просто зосередьтеся на розробці.

[pic

Дізнайтесь більше в документації!

Leapcell Twitter: https://x.com/LeapcellHQ

Перекладено з: FastAPI + Uvicorn = Blazing Speed: The Tech Behind the Hype

Leave a Reply

Your email address will not be published. Required fields are marked *