闪电侠 Uvicorn
阅读本文大概需要 3.6 分钟。
什么是 Uvicorn ?
答:Uvicorn 是基于 uvloop 和 httptools 构建的非常快速的 ASGI 服务器。
什么是 uvloop 和 httptools ?
答:uvloop 用于替换标准库 asyncio 中的事件循环,使用 Cython 实现,它非常快,可以使 asyncio 的速度提高 2-4 倍。asyncio 不用我介绍吧,写异步代码离不开它。
httptools 是 nodejs HTTP 解析器的 Python 实现。
什么是 ASGI 服务器?
答:异步网关协议接口,一个介于网络协议服务和 Python 应用之间的标准接口,能够处理多种通用的协议类型,包括 HTTP,HTTP2 和 WebSocket。
请简单介绍下 Uvicorn
答:目前,Python 仍缺乏异步网关协议接口,ASGI 的出现填补了这一空白,现在开始,我们能够使用共同的标准为所有的异步框架来实现一些工具,ASGI 帮助 Python 在 Web 框架上和 Node.Js 及 Golang 相竞争,目标是获得高性能的 IO 密集型任务,ASGI 支持 HTTP2 和 WebSockets,WSGI 是不支持的。
Uvicorn 目前支持 HTTP1.1 和 WebSocket,计划支持 HTTP2。
使用方法:
$ 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 uvicornasync def app(scope, receive, send):...if __name__ == "__main__":uvicorn.run("example:app", host="127.0.0.1", port=5000, log_level="info")
使用命令行时,你可以使用 uvicorn --help
来获取帮助。
Usage: uvicorn [OPTIONS] APPOptions:--host TEXT Bind socket to this host. [default:127.0.0.1]--port INTEGER Bind socket to this port. [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 TEXT Set reload directories explicitly, insteadof using the current working directory.--workers INTEGER Number of worker processes. Defaults to the$WEB_CONCURRENCY environment variable ifavailable. Not valid with --reload.--loop [auto|asyncio|uvloop|iocp]Event loop implementation. [default: auto]--http [auto|h11|httptools] HTTP protocol implementation. [default:auto]--ws [auto|none|websockets|wsproto]WebSocket protocol implementation.[default: auto]--lifespan [auto|on|off] Lifespan implementation. [default: auto]--interface [auto|asgi3|asgi2|wsgi]Select ASGI3, ASGI2, or WSGI as theapplication interface. [default: auto]--env-file PATH Environment configuration file.--log-config PATH Logging configuration file.--log-level [critical|error|warning|info|debug|trace]Log level. [default: info]--access-log / --no-access-log Enable/Disable access log.--use-colors / --no-use-colors Enable/Disable colorized logging.--proxy-headers / --no-proxy-headersEnable/Disable X-Forwarded-Proto,X-Forwarded-For, X-Forwarded-Port topopulate remote address info.--forwarded-allow-ips TEXT Comma separated list of IPs to trust withproxy headers. Defaults to the$FORWARDED_ALLOW_IPS environment variable ifavailable, or '127.0.0.1'.--root-path TEXT Set the ASGI 'root_path' for applicationssubmounted below a given URL path.--limit-concurrency INTEGER Maximum number of concurrent connections ortasks to allow, before issuing HTTP 503responses.--backlog INTEGER Maximum number of connections to hold inbacklog--limit-max-requests INTEGER Maximum number of requests to service beforeterminating the process.--timeout-keep-alive INTEGER Close Keep-Alive connections if no new datais received within this timeout. [default:5]--ssl-keyfile TEXT SSL key file--ssl-certfile TEXT SSL certificate file--ssl-version INTEGER SSL version to use (see stdlib ssl module's)[default: 2]--ssl-cert-reqs INTEGER Whether client certificate is required (seestdlib ssl module's) [default: 0]--ssl-ca-certs TEXT CA certificates file--ssl-ciphers TEXT Ciphers to use (see stdlib ssl module's)[default: TLSv1]--header TEXT Specify custom default HTTP response headersas a Name:Value pair--help Show this message and exit.
使用进程管理器
使用进程管理器确保你以弹性方式运行运行多个进程,你可以执行服务器升级而不会丢弃客户端的请求。
一个进程管理器将会处理套接字设置,启动多个服务器进程,监控进程活动,监听进程重启、关闭等信号。
Uvicorn 提供一个轻量级的方法来运行多个工作进程,比如 --workers 4
,但并没有提供进行的监控。
使用 Gunicorn
Gunicorn 是成熟的,功能齐全的服务器,Uvicorn 内部包含有 Guicorn 的 workers 类,允许你运行 ASGI 应用程序,这些 workers 继承了所有 Uvicorn 高性能的特点,并且给你使用 Guicorn 来进行进程管理。
这样的话,你可能动态增加或减少进程数量,平滑地重启工作进程,或者升级服务器而无需停机。
在生产环境中,Guicorn 大概是最简单的方式来管理 Uvicorn 了,生产环境部署我们推荐使用 Guicorn 和 Uvicorn 的 worker 类:
gunicorn example:app -w 4 -k uvicorn.workers.UvicornWorker
执行上述命令将开户 4 个工作进程,其中 UvicornWorker 的实现使用 uvloop 和httptools 实现。在 PyPy 下运行,你可以使用纯 Python 实现,可以通过使用UvicornH11Worker 类来做到这一点。
gunicorn -w 4 -k uvicorn.workers.UvicornH11Worker
Gunicorn 为 Uvicorn 提供了不同的配置选项集,但是一些配置暂不支持,如--limit-concurrency
。
使用 Supervisor
Supervisor 作为进程管理器,以下两点二选一:
•使用其文件描述符将套接字移交给 uvicorn,supervisor 始终将文件描述符置 0,并且必须在本 fcgi-program 中进行设置。•为每个 uvicorn 进程使用 UNIX 套接字。
一个简单的主管配置可能看起来像这样:administratord.conf:
[supervisord] [fcgi-program:uvicorn]
socket = tcp:// localhost:8000
命令= venv / bin / uvicorn --fd 0示例:App
numprocs = 4
process_name = uvicorn-%(process_num)d
stdout_logfile = / dev /标准输出
stdout_logfile_maxbytes = 0
然后运行supervisord -n。
使用 Circus
使用 Circus 与 Supervisor 很类似。配置文件 circus.ini 如下:
[watcher:web]
cmd = venv/bin/uvicorn --fd $(circus.sockets.web) example:App
use_sockets = True
numprocesses = 4[socket:web]
host = 0.0.0.0
port = 8000
与 Nginx 部署
Nginx 作为 Uvicorn 进程的代理并不是必须的,你可以使用 Nginx 做为负载均衡。推荐使用 Nginx 时配置请求头,如 X-Forwarded-For
,X-Forwarded-Proto
,以便 Uvicorn 识别出真正的客户端信息,如 IP 地址,scheme 等。这里有一个配置文件的样例:
http {server {listen 80;client_max_body_size 4G;server_name example.com;location / {proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_redirect off;proxy_buffering off;proxy_pass http://uvicorn;}location /static {# path for static filesroot /path/to/app/static;}}upstream uvicorn {server unix:/tmp/uvicorn.sock;}}
使用 HTTPS
使用 HTTPS 证书是必须的,推荐使用免费的 Let's Encrypt。
$ uvicorn example:app --port 5000 --ssl-keyfile=./key.pem --ssl-certfile=./cert.pem
使用 Gunicorn 也可以直接使用证书。
$ gunicorn --keyfile=./key.pem --certfile=./cert.pem -k uvicorn.workers.UvicornWorker example:app
参考文档
1.官方文档-介绍 https://www.uvicorn.org/2.官方文档-部署 https://www.uvicorn.org/deployment/
闪电侠 Uvicorn相关推荐
- 追了源码,做了测试,终于实现python的uvicorn日志自行配置
一.背景 有人提出,message日志不能放我们自己的服务的日志,需要将该日志单独搞到一个地方. 二.先说结论 本文直接上结论,可能是全CSDN唯一的解释.哈哈哈哈哈哈哈哈. 在uvicorn启动的时 ...
- 串口调试助手 rtc 显示时间_闪电侠串口网络调试助手
作为一个嵌入式开发工程师,一直苦于没有一个用起来很顺手的串口网络调试工具,于是乎,还等什么呢,自己做呗,废话不多说,今天正式发布一款基于C#开发的[闪电侠串口网络调试助手]. [闪电侠调试助手]是集合 ...
- 【测评】海康EliteX---全球首款USB4.0移动固态硬盘,硬盘黑科技,移动闪电侠
目 录 一 测评信息 二 写在前面 三 始于颜值 四 测评体验 4.1 超便携 4.2 超快速 4.3 更强劲 4.4 更安全 五 写在最后 一 测评信息 设备型号:HS-ESSD-Elite X ...
- uvicorn 更改fastapi 运行host和port
在命令行输入uvicorn --help可以显示参数介绍,主要两个参数: --host TEXT Bind socket to this host. [default:127.0.0.1] --por ...
- python编程制作接金币游戏,闪电侠接金币的FlashMan类
python the Flash man catch coin gif animation 闪电侠是美剧,这里是一个小游戏,操作闪电侠接不断冒出来的金币.本模块定义了FlashMan类.这个模块能单独 ...
- gunicorn、uwsgi、uvicorn认识
文章目录 一.概述 1.1 背景 二.详情 2.1 uwsgi_pass与uwsgi 2.2 proxy_pass 与gunicorn 2.3 uvicorn 三.总结 一.概述 1.1 背景 在使用 ...
- 电影《闪电侠》观后感
上周看了电影<闪电侠>,主要是闪电侠这个人成长过程,与以往英雄题材类还是有些不太一样的,像之前蜘蛛侠和钢铁侠,都是讲主人公怎么成为那个英雄的,而本部电影是一个类似倒叙,他自己本身就已经是闪 ...
- 【Python随笔】python的web开发——WSGI、ASGI、uvicorn与FastAPI
今天这篇文章,聊一下python在web开发上的一些基础实现,阐述下自己理解中的WSGI.ASGI,以及拿uvicorn+FastAPI的组合举个ASGI应用的例子. WSGI python的web服 ...
- 【闪电侠学netty】第6章 客户端与服务端双向通信
[Netty]读书笔记 - 跟闪电侠学netty 1. 内容概要 1.1 本节实现功能 客户端:连接服务器,之后向服务器发送数据 服务端:接收数据后打印,并向客户端发送数据 1.2 本节知识点 1.2 ...
最新文章
- WPF中的容器控件——GridSplit
- XamarinAndroid组件教程设置动画的时长参数
- python基础知识整理-Python3基础知识(一)
- XML文件的生成与读取
- java如何將數組反轉_Java基礎練習題 (4)數組操作
- 使用SublimeText 作为Python 的开发环境
- [Swift]随slider变化而变化的圆
- JPA一对多循环引用的解决
- 数据库中间件漫谈——看看云时代,它会走向何方
- php 设置页面最大执行时间 set_time_limit max_execution_time
- stm32中如何避免等待_地坪漆施工中如何避免常见的小问题
- Ferret 经度范围划定时的方向问题
- mysql 统计市县的数量
- Google提供Fastboot和ADB单独下载服务(转载)
- xzp android webview,加载gif动态图的三种方式
- 在Vue中使用svg格式字体图标
- 俄勒冈健康与科学大学计算机,俄勒冈健康与科学大学费用
- 矩阵求逆操作的复杂度分析(逆矩阵的复杂度分析)
- 全媒体运营师胡耀文教你:产品运营生于痛点,死于增长
- 如何改变讨好型人格?