报错背景
工程中开启进程池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操作之前将旧链接关闭并启动新链接。这样就可以防止因为找不到数据库连接而报错。