V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Te11UA
V2EX  ›  Python

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

  •  
  •   Te11UA · 2020-12-26 10:55:29 +08:00 · 3262 次点击
    这是一个创建于 1230 天前的主题,其中的信息可能已经有所发展或是发生改变。

    复现过程:

    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 的方式就无法运行。如果再不行的话,只能考虑多次执行打包后的文件了。

    请大佬们解惑。

    运行环境:

    • Python 3.8.6
    • Ubuntu 18.04
    2 条回复    2020-12-28 15:32:43 +08:00
    wynemo
        1
    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
        2
    Te11UA  
    OP
       2020-12-28 15:32:43 +08:00
    @wynemo #1 感谢,已解决,不过请问为什么不推荐 pyinstaller 打包运行呢,不应该性能更好一点吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1086 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:43 · PVG 06:43 · LAX 15:43 · JFK 18:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.