首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当uvicorn workers>1时,uvicorn和带有pyinstaller问题的fastAPI

当uvicorn workers>1时,uvicorn和带有pyinstaller问题的fastAPI
EN

Stack Overflow用户
提问于 2020-12-24 20:03:31
回答 2查看 1.3K关注 0票数 1

我检查了PyInstaller and FastAPI (maximum recursion depth exceeded)Pyinstaller-compiled Uvicorn server does not start correctly

FastAPI演示main.py

代码语言:javascript
运行
复制
import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
    return {"hello": "world"}

if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=58000, reload=False)

首先运行pyinstaller pyinstaller -F main.py --clean并在规范中添加hidden_imports

代码语言:javascript
运行
复制
hidden_imports=[
                'uvicorn.logging',
                'uvicorn.loops',
                'uvicorn.loops.auto',
                'uvicorn.protocols',
                'uvicorn.protocols.http',
                'uvicorn.protocols.http.auto',
                'uvicorn.protocols.websockets',
                'uvicorn.protocols.websockets.auto',
                'uvicorn.lifespan',
                'uvicorn.lifespan.on',
            ]

它工作得很好,但当workers大于1时,应用程序必须是字符串:

WARNING: You must pass the application as an import string to enable 'reload' or 'workers'.

所以我改成:

代码语言:javascript
运行
复制
if __name__ == '__main__':
    uvicorn.run("main:app", host="0.0.0.0", port=58000, reload=False, workers=2)

之后,我运行了应用程序dist/main,它创建了许多如下应用程序,使用100%的CPU和100%的内存,速度很快:

error message

适用于Python 3.8.3和pyinstaller 4.0

EN

回答 2

Stack Overflow用户

发布于 2021-05-19 00:42:15

在开始的时候调用(在Windows上) mutiprocessing.freeze_support()是很重要的,参见官方的docs

代码语言:javascript
运行
复制
import multiprocessing
...
...
...
if __name__ == '__main__':
    mutiprocessing.freeze_support()
    uvicorn.run("main:app", host="0.0.0.0", port=58000, reload=False, workers=2)

此外,可能需要将模块main添加为隐藏导入。

票数 2
EN

Stack Overflow用户

发布于 2021-05-18 21:04:49

对我来说,它看起来像是一个无限的递归。我怀疑原因与main:app的自我引用和PyInstaller sys的一些黑魔法有关,这些黑魔法将__name__设置为__main__

我建议将app移到一个单独的模块中,并在uvicorn.run()中从该模块引用它

代码语言:javascript
运行
复制
# app.py
from fastapi import FastAPI


app = FastAPI()

@app.get("/")
def root():
    return {"hello": "world"}
代码语言:javascript
运行
复制
# main.py
import uvicorn


if __name__ == "__main__":
    uvicorn.run("app:app", host="0.0.0.0", port=58000, reload=False, workers=2)

另外,不要忘记将app.py添加为PyInstaller的隐藏导入:

代码语言:javascript
运行
复制
hidden_imports=[
    'uvicorn.logging',
    'uvicorn.loops',
    'uvicorn.loops.auto',
    'uvicorn.protocols',
    'uvicorn.protocols.http',
    'uvicorn.protocols.http.auto',
    'uvicorn.protocols.websockets',
    'uvicorn.protocols.websockets.auto',
    'uvicorn.lifespan',
    'uvicorn.lifespan.on',
    'app',
]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65438069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档