[求助] Uvicorn + FastAPI 在 pyinstaller 出现的问题,导致 app 不断创建

2020-12-26 10:55:29 +08:00
 Te11UA

复现过程:

FastAPI demo main.py:

import uvicorn
from fastapi import FastAPI

app = FastAPI()

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

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

此时使用 python main.py 运行无问题。

但使用 pyinstaller -F main.py --clean 打包,修改下 spec 中的 hidden_import 后 运行 pyinstaller main.spec:

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

尝试运行 exe,当 workers 为 1 的时候没有问题,当 workers 为 2 的时候,会一直创建 app 直到内存爆炸:

猜测是可能一直重复引用本身出现的问题,但是如果分开 app 和 uvicorn 打包,字符串 "main:app" 引用 app 的方式就无法运行。如果再不行的话,只能考虑多次执行打包后的文件了。

请大佬们解惑。

运行环境:

3454 次点击
所在节点    Python
2 条回复
wynemo
2020-12-27 16:44:11 +08:00
如果没有特殊需求 建议还是有 python 运行时或者 docker 一把梭。
此问题是的 uvicorn.subprocess.spawn 要加上 freeze_support
参考
https://github.com/pyinstaller/pyinstaller/blob/c595c21ed76fcc3fa43440b33f17c8b332b32ad4/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py
Te11UA
2020-12-28 15:32:43 +08:00
@wynemo #1 感谢,已解决,不过请问为什么不推荐 pyinstaller 打包运行呢,不应该性能更好一点吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/739129

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX