阅读本文大概需要 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相关推荐

  1. 追了源码,做了测试,终于实现python的uvicorn日志自行配置

    一.背景 有人提出,message日志不能放我们自己的服务的日志,需要将该日志单独搞到一个地方. 二.先说结论 本文直接上结论,可能是全CSDN唯一的解释.哈哈哈哈哈哈哈哈. 在uvicorn启动的时 ...

  2. 串口调试助手 rtc 显示时间_闪电侠串口网络调试助手

    作为一个嵌入式开发工程师,一直苦于没有一个用起来很顺手的串口网络调试工具,于是乎,还等什么呢,自己做呗,废话不多说,今天正式发布一款基于C#开发的[闪电侠串口网络调试助手]. [闪电侠调试助手]是集合 ...

  3. 【测评】海康EliteX---全球首款USB4.0移动固态硬盘,硬盘黑科技,移动闪电侠

    目  录 一 测评信息 二 写在前面 三 始于颜值 四 测评体验 4.1 超便携 4.2 超快速 4.3 更强劲 4.4 更安全 五 写在最后 一 测评信息 设备型号:HS-ESSD-Elite X  ...

  4. uvicorn 更改fastapi 运行host和port

    在命令行输入uvicorn --help可以显示参数介绍,主要两个参数: --host TEXT Bind socket to this host. [default:127.0.0.1] --por ...

  5. python编程制作接金币游戏,闪电侠接金币的FlashMan类

    python the Flash man catch coin gif animation 闪电侠是美剧,这里是一个小游戏,操作闪电侠接不断冒出来的金币.本模块定义了FlashMan类.这个模块能单独 ...

  6. gunicorn、uwsgi、uvicorn认识

    文章目录 一.概述 1.1 背景 二.详情 2.1 uwsgi_pass与uwsgi 2.2 proxy_pass 与gunicorn 2.3 uvicorn 三.总结 一.概述 1.1 背景 在使用 ...

  7. 电影《闪电侠》观后感

    上周看了电影<闪电侠>,主要是闪电侠这个人成长过程,与以往英雄题材类还是有些不太一样的,像之前蜘蛛侠和钢铁侠,都是讲主人公怎么成为那个英雄的,而本部电影是一个类似倒叙,他自己本身就已经是闪 ...

  8. 【Python随笔】python的web开发——WSGI、ASGI、uvicorn与FastAPI

    今天这篇文章,聊一下python在web开发上的一些基础实现,阐述下自己理解中的WSGI.ASGI,以及拿uvicorn+FastAPI的组合举个ASGI应用的例子. WSGI python的web服 ...

  9. 【闪电侠学netty】第6章 客户端与服务端双向通信

    [Netty]读书笔记 - 跟闪电侠学netty 1. 内容概要 1.1 本节实现功能 客户端:连接服务器,之后向服务器发送数据 服务端:接收数据后打印,并向客户端发送数据 1.2 本节知识点 1.2 ...

最新文章

  1. WPF中的容器控件——GridSplit
  2. XamarinAndroid组件教程设置动画的时长参数
  3. python基础知识整理-Python3基础知识(一)
  4. XML文件的生成与读取
  5. java如何將數組反轉_Java基礎練習題 (4)數組操作
  6. 使用SublimeText 作为Python 的开发环境
  7. [Swift]随slider变化而变化的圆
  8. JPA一对多循环引用的解决
  9. 数据库中间件漫谈——看看云时代,它会走向何方
  10. php 设置页面最大执行时间 set_time_limit max_execution_time
  11. stm32中如何避免等待_地坪漆施工中如何避免常见的小问题
  12. Ferret 经度范围划定时的方向问题
  13. mysql 统计市县的数量
  14. Google提供Fastboot和ADB单独下载服务(转载)
  15. xzp android webview,加载gif动态图的三种方式
  16. 在Vue中使用svg格式字体图标
  17. 俄勒冈健康与科学大学计算机,俄勒冈健康与科学大学费用
  18. 矩阵求逆操作的复杂度分析(逆矩阵的复杂度分析)
  19. 全媒体运营师胡耀文教你:产品运营生于痛点,死于增长
  20. 如何改变讨好型人格?

热门文章

  1. VUE 脚手架框架 编写一个简洁的登录界面
  2. 程序员编程领域的经典书籍推荐
  3. 图片加载失败,使用默认logo
  4. BLE--Access Address
  5. oracle牙间刷,60支OraCleen智能牙刷送送送!
  6. 网络上排名前500的电子电气网站
  7. 北大医院马主任谈医疗行业IT运维难题
  8. 2023基于微信小程序的服装企业人事OA管理系统+后台管理系统(Springboot+mysql)-JAVA.VUE(论文+开题报告+运行)
  9. a href 跳页面 打开新标签
  10. usbasp下载线驱动