属于歪门邪道,不多BB,直接上方法
在创建的.py文件中输入以下脚本
from supervisor_main import *
class Get:
def __init__(self):
self.program=""
get = Get();
get.program="xxxxxxxx" #你的管理器中守护进程的名称
supervisor_main_obj = supervisor_main();
supervisor_main_obj.StopProcess(get)
print("stop mission over")
supervisor_main_obj.StartProcess(get)
print("start mission over")
设置计划任务 Shell脚本定时执行
脚本内容 使用python运行刚才的脚本
python /www/server/panel/plugin/supervisor/ShuiFurerunAutoStop.py
大功告成
背景故事:
线上有一个PHP项目,每天有一个固定时间点需要在短时间内处理大量并发数据,比如同时执行一千多个连表修改事务,当然也可以使用部分优秀的异步框架实现,但是这个项目我使用的是tp5+think queue的方式,使用Supervisor管理器多线程的特性,同时开启多个队列监听,框架分批将事务处理推入消息队列,让Supervisor管理器中的任务监听守护进程进行多线程消费,但是这样子就造成一个问题,队列监听的守护进程拉起的数据库连接他是不释放的,只要进程存在就会一直保持,前期还出现了数据库连接超时报错导致队列业务逻辑无法执行的问题,后来通过延长数据库超时时间进行第一次解决,可是后来系统的业务量递增,数据库出现了连接数量过多的问题,我意识到数据库连接资源还得释放,发现重启守护进程可以释放连接,还同时解决了数据库连接超时的问题
优化前长期占用大量数据库连接资源不释放,优化后只有短期内高峰,其余时间均保持空闲