用python的multiprocessing模块把服务改成多进程后, 遇到几个问题:
数据库连接失败, 总是在服务运行几十秒后, 卡主, 然后报错数据库连接失败
InterfaceError: (0, '')
检查后发现, 是把数据库连接的操作放到while循环中了, 创建了大量的连接导致的服务是用supervisor工具来启动的, 当用stop停掉这个含子进程的 服务时, 用ps查看, 发现只kill掉了父进程, 但是子进程仍然在后台跑着
首先,怀疑是不是守护进程的问题, 查看multiprocessing模块,
p.daemon
默认是False, 也就表示, 默认不是守护进程这里解释一下守护进程, 如果一个子进程设置为守护进程, 那么当父进程结束时, 子进程不会随父进程退出, 守护进程也被称为精灵进程
回到问题, 这里默认就设置了
daemon=False
, 所以也不是这个问题导致然后又发现, 用ctrl+C 结束进程, 就不会出现这种情况, 所以, 问题就指向了supervisor
解决方法:
- 在supervisor的配置中(是指当前服务的配置), 添加两条
killasgroup=true
stopasgroup=true
然后别忘了在supervisorctl的控制台中,update
一下