繁体   English   中英

当 uvicorn workers>1 时 uvicorn 和 fastAPI 与 pyinstaller 问题

[英]uvicorn and fastAPI with pyinstaller problem when uvicorn workers>1

我检查了PyInstaller 和 FastAPI(超出最大递归深度)并且Pyinstaller 编译的 Uvicorn 服务器无法正确启动

FastAPI 演示main.py

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

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',
            ]

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

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

所以我改为:

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

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

错误信息

适用于 Python 3.8.3 和 pyinstaller 4.0

在开始时调用(在 Windows 上) mutiprocessing.freeze_support()很重要,请参阅官方文档

import multiprocessing
...
...
...
if __name__ == '__main__':
    mutiprocessing.freeze_support()
    uvicorn.run("main:app", host="0.0.0.0", port=58000, reload=False, workers=2)

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

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

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

# app.py
from fastapi import FastAPI


app = FastAPI()

@app.get("/")
def root():
    return {"hello": "world"}
# main.py
import uvicorn


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

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

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',
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM