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
eteryao
V2EX  ›  Python

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

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






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




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

    后一点 python 做及其难 go 就简单多了 所以基本所有的 go 服务都自带 gracefulshutdown。python 里有这词吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2862 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:08 · PVG 21:08 · LAX 05:08 · JFK 08:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.