Hypercorn 是一个支持异步 ASGI 和同步 WSGI 应用的高效 Python 服务器。它结合了现代协议支持(包括 HTTP/1、HTTP/2 和 HTTP/3),并且为异步 Web 框架(如 FastAPI 和 Quart)提供了卓越的性能和灵活性。通过 Hypercorn,开发者可以轻松处理高并发请求,同时支持多种协议和事件循环。
⭕️宇宙起点
- 💯 核心功能
- 1. 多协议支持
- 2. 多事件循环支持
- 3. 灵活的配置方式
- 4. 优雅的关闭机制
- 💯 示例代码
- Hello World ASGI 应用
- 使用 Trio 事件循环的示例
- 💯 配置选项表
- 💯 适用场景
- 📥 下载地址
- 💬 结语
- 📒 参考文献
💯 核心功能
1. 多协议支持
Hypercorn 支持 HTTP/1、HTTP/2 和 HTTP/3 协议,同时也支持 WebSockets。HTTP/2 和 HTTP/3 的引入极大提高了并发性能和传输效率,尤其在需要处理大量并发请求的应用中表现优异。
2. 多事件循环支持
Hypercorn 不仅支持 Python 的 asyncio
事件循环,还支持 trio
,并且与 uvloop
完全兼容。这种灵活性允许开发者根据应用的需求选择最合适的事件循环,以实现更高效的并发性能。
3. 灵活的配置方式
Hypercorn 提供了多种配置方式,包括:
- 命令行参数:可以快速设置服务器启动参数。
- TOML 文件:适合项目中统一管理配置。
- Python 配置模块:可以通过动态代码生成配置文件。
例如,可以使用.toml
文件进行配置:
hypercorn --config config.toml
TOML 文件示例:
bind = "127.0.0.1:8000"
access_log_format = "%(h)s %(r)s %(s)s"
Python 动态配置示例:
from hypercorn.config import Config
config = Config()
config.bind = ["127.0.0.1:8000"]
4. 优雅的关闭机制
Hypercorn 支持优雅关闭功能,当收到退出信号(如 SIGTERM
)时,服务器会等待正在处理的请求完成后才退出,避免请求丢失。以下是实现优雅关闭的代码示例:
import asyncio
import signal
async def app(scope, receive, send):
if 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!',
})
shutdown_event = asyncio.Event()
def _signal_handler(*_: Any) -> None:
shutdown_event.set()
loop = asyncio.get_event_loop()
loop.add_signal_handler(signal.SIGTERM, _signal_handler)
loop.run_until_complete(serve(app, config, shutdown_trigger=shutdown_event.wait))
💯 示例代码
Hello World ASGI 应用
这是一个简单的 ASGI 应用,使用 Hypercorn 运行:
async def app(scope, receive, send):
if 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!',
})
运行命令:
hypercorn app:app --bind 127.0.0.1:8000
使用 Trio 事件循环的示例
import trio
from hypercorn.config import Config
from hypercorn.trio import serve
config = Config()
config.bind = ["127.0.0.1:8000"]
async def app(scope, receive, send):
if 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 from Trio!',
})
trio.run(serve, app, config)
💯 配置选项表
以下是 Hypercorn 常用的配置选项:
配置项 | 命令行参数 | 默认值 | 说明 |
---|---|---|---|
bind | --bind | 127.0.0.1:8000 | 监听的地址和端口 |
access_log_format | --access-logformat | %(h)s %(r)s %(s)s | 定义访问日志的格式 |
graceful_timeout | --graceful-timeout | 300 秒 | 在收到终止信号后,允许的最大优雅关闭时间 |
debug | --debug | False | 启用调试模式,提供更多日志信息 |
h2_max_concurrent_streams | N/A | 100 | HTTP/2 的最大并发流数量 |
include_server_header | N/A | True | 是否包含 Server: Hypercorn 的响应头 |
read_timeout | --read-timeout | 无 | TCP 读取超时时间 |
ca_certs | --ca-certs | 无 | 指定 SSL CA 证书路径 |
💯 适用场景
Hypercorn 非常适合以下场景:
- 高并发异步应用:对于需要处理大量并发请求的应用,Hypercorn 的异步架构能够充分发挥其优势。
- 多协议支持:对于需要同时处理 HTTP/1、HTTP/2、HTTP/3 和 WebSockets 的应用,Hypercorn 提供了全面的支持。
- 优雅关闭需求:在生产环境中,应用可能需要在不中断现有请求的情况下安全退出,Hypercorn 提供了优雅关闭的能力。
📥 下载地址
Hypercorn 最新版 下载地址
💬 结语
Hypercorn 的灵活性和现代化协议支持,使其成为现代 Web 应用程序的理想选择,特别是在异步框架下,它能够显著提升应用的性能和响应速度。
📒 参考文献
- Hypercorn GitHub仓库