Що таке Uvicorn?
Відповідь: 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
[
Нарешті, хочу представити платформу, яка найкраще підходить для розгортання FastAPI сервісів: Leapcell.
Leapcell має наступні функції:
1. Підтримка кількох мов
Розробка на JavaScript, Python, Go або Rust.
2. Безкоштовне розгортання необмеженої кількості проєктів
Платіть тільки за використання — без запитів, без платіжних зобов'язань.
3. Неперевершена економія витрат
Оплата за використання без платних простоїв.
Приклад: $25 підтримує 6.94 млн запитів при середньому часі відповіді 60 мс.
4. Простота використання для розробників
Інтуїтивно зрозумілий інтерфейс для легкого налаштування.
Повністю автоматизовані CI/CD пайплайни та інтеграція з GitOps.
Аналітика та журнали в реальному часі для корисних відомостей.
5. Легке масштабування та висока продуктивність
Автоматичне масштабування для зручної обробки високої кількості одночасних підключень.
Відсутність операційних витрат — просто зосередьтеся на розробці.
[
Дізнайтесь більше в документації!
Leapcell Twitter: https://x.com/LeapcellHQ
Перекладено з: FastAPI + Uvicorn = Blazing Speed: The Tech Behind the Hype