首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
eteryao
V2EX  ›  Python

萌新提问:Flask 如何在所有请求结束之后再进行重启?

  •  
  •   eteryao · 98 天前 · 2706 次点击
    这是一个创建于 98 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在的需求是,开发完了一个新功能,需要部署到生产。
    我要如何在生产所有的请求处理完了之后,再进行部署重启 flask 服务? (优雅关闭?)
    因为如果直接部署,那么生产的请求肯定是会报错出现异常的。为了避免这种情况。请在座的各位大佬帮帮我这个萌新!
    27 回复  |  直到 2019-11-25 10:50:25 +08:00
    youngs
        1
    youngs   98 天前
    126 天前就已经是萌新了,现在还叫萌新
    eteryao
        2
    eteryao   98 天前
    @youngs 不要在意这种细节
    scukmh
        3
    scukmh   98 天前
    用 ha 呀。
    eteryao
        4
    eteryao   98 天前
    @scukmh 能麻烦具体说一下嘛 谢谢谢谢!
    monsterxx03
        5
    monsterxx03   98 天前
    gunicorn, kill -HUP
    eteryao
        6
    eteryao   98 天前
    @monsterxx03 我们部署没有使用 gunicorn 这点我忘说了 我们是用 docker 进行部署的。
    feiniu
        7
    feiniu   98 天前 via iPhone   ❤️ 2
    凌晨三点更新,






    我乱说的
    Vegetable
        8
    Vegetable   98 天前
    你用什么部署不重要,这个还是要看你用了什么 wsgi 程序,gunicorn or uwsgi?

    https://uwsgi-docs.readthedocs.io/en/latest/articles/TheArtOfGracefulReloading.html

    读一下这个看看,
    还有 gunicorn 的文档 https://docs.gunicorn.org/en/stable/faq.html#how-do-i-reload-my-application-in-gunicorn ,这个我不确定是不是会等待程序结束

    一个比较蠢的办法时修改 nginx 配置,重新启动一个端口提供变更后的服务,让后 nginx -s reload,nginx 会处理好连接
    Vegetable
        9
    Vegetable   98 天前
    @Vegetable *这个我不确定是不是会等待所有连接结束
    XiaoxiaoPu
        10
    XiaoxiaoPu   98 天前
    前面用 nginx 等类似的负载均衡,后面接至少两个 flask 实例,每次部署时,先在负载均衡上摘掉一个,等待活跃请求完成后,重启这个实例,重启完成后再把这个实例加回去,然后再用同样的方式操作下一个实例。
    eteryao
        11
    eteryao   98 天前
    @Vegetable 先感谢一下大佬!我们是直接 docker 部署 以进程的方式直接运行服务。就是在 docker 中运行 python3 xxx.py runsever 这样的命令,不知道我表述的您是否明白。那这样的话还有用您说的这个方法吗。
    andylsr
        12
    andylsr   98 天前 via Android
    楼上凌晨 3 点停机更新可能是最佳方案😂
    eteryao
        13
    eteryao   98 天前
    @andylsr 😂😂😂 虽然我也这么觉得
    winterssy
        14
    winterssy   98 天前 via Android
    @eteryao 生产环境就不是这样部署的,gunicorn 跟 uwsgi 是必须的吧,无论你是否用 Docker。提前通知用户,凌晨闲时更新即可,为啥非要“优雅”关闭?
    f1ren2es
        15
    f1ren2es   98 天前
    @eteryao 用 docker 实现类似 uwsgi 里的 gracefule reload 就好了,多个 docker 依次重启
    Cat73
        16
    Cat73   98 天前
    拿 Nginx 处理下就好
    Vegetable
        17
    Vegetable   98 天前
    @eteryao #11 你这等于时用了 flask 自带的服务器,这个应该只在开发环境使用,性能比较差也不够稳定,用这个服务器的话,你还真就只能用两个 docker 实例+两个内部端口+nginx 去做了,因为这个服务器本身没有提供这个 zero downtime 的功能.
    cz5424
        18
    cz5424   98 天前 via iPhone
    不建议使用 flask 自带的,楼上已经给了很多方案了,比如 gunicorn 热重启
    cz5424
        19
    cz5424   98 天前 via iPhone
    我这边是使用 Gunicorn 的,重启命令
    docker exec -it 容器名字 kill -s HUP 1
    eteryao
        20
    eteryao   98 天前
    @Vegetable 好的 感谢感谢。我自个再去研究一下。
    eteryao
        21
    eteryao   98 天前
    @cz5424 万分感谢。我自个再去研究一下
    dicc
        22
    dicc   98 天前
    @eteryao #21 要不就 先停 nginx,等几分钟,cpu 平稳了再重启?




    我也乱说的
    runtu2019
        23
    runtu2019   98 天前
    shell 脚本几行搞定的事情,监听服务端口的连接情况,端口没有 tcp 连接执行重启,用 crontab 重复执行脚本即可
    fml87
        24
    fml87   98 天前
    就算 uwsgi/gunicorn/nginx 可以安全热重启,通常也无法说服领导在生产环境热重启,所以半夜停服重启基本是方案
    NeinChn
        25
    NeinChn   97 天前
    @runtu2019
    长连接呢....
    连着基础服务的连接呢,name server 的,remote logging 的...
    evlos
        26
    evlos   97 天前 via iPhone
    Zero downtime deployment
    petelin
        27
    petelin   93 天前 via iPhone
    先摘机器 然后看机器上的请求什么时候都处理完了

    后一点 python 做及其难 go 就简单多了 所以基本所有的 go 服务都自带 gracefulshutdown。python 里有这词吗?
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2875 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 15:20 · PVG 23:20 · LAX 07:20 · JFK 10:20
    ♥ Do have faith in what you're doing.