Windows运行多版本Python/pip 和 Uvicorn的方法 及 uvicorn-fastapi本地多worker模式的运用和问题解决

本文讲述了在Windows系统中管理多个Python版本(如Python3.8和3.11),以及如何在不同版本中使用pip和Uvicorn。作者分享了如何在不同Python版本间切换、处理uvicorn多worker模式和reload警告,以及Python3.11版本uvicorn报错的解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Windows上多个版本 Python/pip 和 Uvicorn的共用共存方法

    windows上使用多个版本的python,pip以及在对应版本的环境中使用uvicorn需要注意的一些事情,在此做个笔记。

    比如我目前电脑上安装了两个版本的python,分别是Python3.8和最新的Python3.11,而python3.11是我最新安装的python版本。

    在windows上的git命令窗口中目前使用python -V,显示的是Python3.8.6,而我当前电脑中存在多个python项目,有的项目需要使用原版本3.8,有的则需要使用新版本3.11,显示使用使用python不能达到我的预期目的。

    要使用python3.11,可以将其安装目录下的Python.exe在同目录中复制一份且命名为如python311,这里需要注意不要直接将 python.exe 直接重命名为 python311.exe,这样的话使用pip时就会报错:Fatal error in launcher: Unable to create process using '"C:\Python311\python.exe"之类的错误。

    此处我没有尝试,但我想在使用pip的时候有没有可能通过设置其要查找的exe文件路径解决,不过当下的方式已经可以满足条件,也无所谓了。

    基本我们就可以开始使用python进行pip的安装以及使用uvicorn服务。当然首先要记得将两个python目录和scripts目录写到环境变量里,然后在使用pip的时候使用如下的方式:

#原python版本环境中使用pip查看列表及安装模块
python -m pip list
python -m pip install uvicorn
#3.11版本环境中使用pip查看列表及安装模块
python311 -m pip list
python311 -m pip install uvicorn

    安装uvicorn模块之后,默认uvicorn在两个python版本中的scripts文件夹中都是uvicorn.exe,直接使用uvicorn启动命令会默认使用老版本的python及其uvicorn,这时需要将新python版本中scripts目录里的uvicorn更换一下名称,如uvicorn311。

     然后就可以通过如下命令来启动两个python环境下的uvicorn项目服务。 

#老版本下的python项目
uvicorn main:app --host=127.0.0.1 --port=8000 --reload
#3.11版本中的python项目
uvicorn311 main:app --host=127.0.0.1 --port=8000 --reload

二、uvicorn本地开发fastapi时启用多worker模式 

    uvicorn在本地启动开发的fastapi程序时,想试试看多worker模式,发现其在启动的时候有一行提示: 

$ uvicorn main:app --host=10.118.11.26 --port=8000 --workers=3 --reload
WARNING:  "workers" flag is ignored when reloading is enabled. 

    即当开启了reload 热加载模式时,workers配置将会被忽略。所以在本地开发时如果想体验多worker模式,就不要使用 --reload。这是一个很小的点,但是如果没有注意到这项提示,并且启动后去查看进程发现怎么操作都没有按预期实现多进程时,会很崩溃,因为uvicorn此时并不会因为这样的配置导致无法运行,只是在众多的提示中多了一行字符,很难引起开发者注意,可能导致用户浪费很多的时候去排查。

三、Python3.11版本uvicorn运行报错content = [STATUS_LINE[status_code]]

    之前一直运行顺利的一段代码,突然运行的时候出现了报错http\httptools_impl.py..content = [STATUS_LINE[status_code]]。详细报错内容如下:

# 报错内容
await send(message)
File "C:\Python3.11.0\Lib\site-packages\uvicorn\protocols\http\httptools_impl.py", line 499, in send
content = [STATUS_LINE[status_code]]

# 涉及的程序部分
class AppException(Exception):
    def __init__(code..., message...)

# 异常部分
raise AppException(code=801, message="格式错误")

    排查发现使用raise AppException抛出异常问题的时候,801这个code会导致报错,追踪到程序出错的文件及相关的内容如下:

C:\Python3.11.0\Lib\site-packages\uvicorn\protocols\http\httptools_impl.py
STATUS_LINE = {
    status_code: _get_status_line(status_code) for status_code in range(100, 600)
}

    对比发现当前我运行的python项目中 uvicorn 的版本为 0.20.0 ,而之前运行成功的 uvicorn 版本为 0.13.4 。并对比了一下两个版本中的 httptools_impl.py 文件,未去寻找最终导致报错的语句逻辑在哪,但经过尝试,可以判定为更新的版本对传入的code参数有要求,必须在100-600之间,而在之前的版本中虽然也有这个范围,但是不会强制要求不会报错。找到了问题点就好办了,可以通过底层修改传入的code, 并且如果有其它需要传递其它的内容,可以在__init__方法中添加其它的参数进行处理。

### Gunicorn与FastAPI的集成 为了实现Gunicorn与FastAPI的应用程序部署,通常会利用Gunicorn作为WSGI服务器来运行基于ASGI协议构建的FastAPI应用。这种组合能够提供高效稳定的生产环境支持。 #### 安装依赖库 首先安装必要的Python包,包括`fastapi``uvicorn`(用于本地开发测试),以及`gunicorn`以便于生产环境中启动服务: ```bash pip install fastapi uvicorn gunicorn ``` #### 创建简单的FastAPI应用程序 下面是一个基本的FastAPI应用实例,定义了一个根路径返回消息给客户端请求: ```python from fastapi import FastAPI app = FastAPI() @app.get("/") async def read_root(): return {"message": "Hello World"} ``` 保存上述代码到文件名为`main.py`中。 #### 使用Gunicorn启动FastAPI应用 通过命令行可以很方便地使用Gunicorn来托管这个FastAPI项目,在终端执行如下指令即可完成部署操作: ```bash gunicorn -k uvicorn.workers.UvicornWorker main:app --bind 0.0.0.0:8000 ``` 这里指定了工作进程类型为Uvicorn Worker,并绑定到了本机所有IP地址上的端口8000监听HTTP连接[^1]。 ### 性能对比分析 当考虑性能因素时,FastAPI本身已经具备非常出色的处理能力;而搭配上像Gunicorn这样的进程管理工具,则可以在高并发场景下进一步提升整体表现。具体表现在以下几个方面: - **异步特性**:得益于其内置的支持协程机制,使得单个工作线程能够在等待I/O期间切换至其他任务继续执行,从而提高了资源利用率。 - **水平扩展性**:借助Gunicorn提供的简单配置选项轻松调整工作数量以适应不同负载需求,确保即使面对大量访问也能保持良好响应速度。 - **稳定性保障**:相比于单纯依靠单一进程模式下的Web框架来说,采用个子进程共同承担业务逻辑计算的方式更有利于应对突发流量冲击并减少因意外崩溃而导致的服务中断风险。 综上所述,对于追求高性能且稳定性的现代Web API设计而言,选择将Gunicorn同FastAPI相结合无疑是一种明智之举。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值