复现过程:
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 的方式就无法运行。如果再不行的话,只能考虑多次执行打包后的文件了。
请大佬们解惑。
运行环境:
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.