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

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






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

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

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

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

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

© 2021 V2EX