使用的tiangolo/uvicorn-gunicorn-fastapi作为服务端,在启动的时候通过配置gunicorn_conf.py中的workers来实现启动多进程来应对并发请求,今天突然如果服务在运行的过程中有些原因需要重启,有没有办法做到平滑重启呢?就像nginx的 -s reload一样。之前在文章:http://www.04007.cn/article/944.html 中曾认为发送HUP信号给gunicorn,就会平滑reload。但今天真实测试发现其能实现代码重加载,但并不能平滑。本文地址:http://www.04007.cn/article/1016.html,未经许可,不得转载.
因为上篇文章中的代码使用的是软链接,无法进行测试,这次的测试程序中我的代码是直接在docker环境中。在一边进行压测的情况下一边执行 $kill -HUP masterId,可以发现子进程ID确实是都跟着重新生成了,但是压测的程序就直接挂了报错:apr_socket_recv: Connection reset by peer (104)本文地址:http://www.04007.cn/article/1016.html,未经许可,不得转载.
#我使用的重启进程的命令: #提取主进程PID进行处理 pstree -ap|grep gunicorn | head -1 | awk '{print substr($4,index($4,",")+1)}' kill -HUP `pstree -ap|grep gunicorn | head -1 | awk '{print substr($4,index($4,",")+1)}'` #直接从容器中hub启动 docker exec -it 容器ID或名称 /bin/bash -c 'kill -HUP `cat /tmp/gunicorn.pid`'本文地址:http://www.04007.cn/article/1016.html,未经许可,不得转载.
另外为了实现我的想法,我找了找gunicorn的配置值中是否有相关的配置项,找到一个看起来有用的项:graceful_timeout。graceful_timeout:接收到restart信号后,worker可以在graceful_timeout时间内,继续处理完当前requests。但在实际测试中并没有发现其有什么作用,还是一样。gunicorn有一个配置max_requests表示worker重启之前处理的最大requests数,看来gunicorn能够配置每个worker的最大处理请求数,但我现在想实现的是最长处理请求时间。即每个worker在处理多少请求时间后自动重启,当然也和max_requests一样可以相应的配置一个类max_requests_jitter项,设置抖动参数,防止worker全部同时重启。本文地址:http://www.04007.cn/article/1016.html,未经许可,不得转载.
所以目前来看,我还是没有找到gunicorn平滑重启的方法,希望有读者找到此方法后不吝赐教。本文地址:http://www.04007.cn/article/1016.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/1016.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |