python+postgresql进程池中子进程连接不到数据库:SSL SYSCALL error: EOF detected

报错背景

工程中开启进程池pool = multiprocessing.Pool(processes=3),并且将需要执行的函数传递进去,执行时一直报错。我拦截到好几种报错SSL SYSCALL error: EOF detected还有SSL error: decryption failed or bad record mac还有一种挺长一段server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request,最后一种wrong version number看了很多解答文章,有的说postgresql设置出了问题,需要将.conf中的某个参数进行更改,也有的说是内存问题等等,经过我排查之后,都与这些没有关系。我的意思不是说这些方法没有效果,可能只是不适合我现在状况的解答,具体的各位可以试一试。哦,对了,还有的说是可能原生语句支持比较好,本人用的orm查询。

问题分析

通过这些调试这些报错位置以及对报错信息的收集翻译,基本都是与数据库连接有关系,无非就是数据库连接掉了,然后我再进行orm操作的时候,获取到了之前旧的数据库连接,并且进程池中子进程并没有自己去建立新的连接而是沿用父进程中的数据库连接,导致某一个子进程完成的比较快,从而退出引起的。(ps。这一点我一直没太明白,只能说问题解决了。父进程中一直到进程池关闭我也没有进行数据库连接,在入口有个校验装饰器,那确实连接了数据库获取信息。但是装饰器不是应该完成退出了吗?我还在查找这方面的原因)

解决方法

通过引入from django import db在子进程中创建db.close_old_connections(),我理解为只要在orm操作之前将旧链接关闭并启动新链接。这样就可以防止因为找不到数据库连接而报错。

参考连接

csdn参考

stackoverflow

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值