django多进程连接数据库主进程要关闭数据库连接

多进程连接数据库,开启子进程时,主进程要记得关闭数据库连接

response = {"result": True, "message": ""}
q = Queue()
t1=Process(target=saveThreat, args=(q,))
threatTmps_l = ThreatTmp.objects.all()
servers = Server.objects.all()
id = int(round(time.time() * 1000))
ips = threatTmps_l.values_list("ip", flat=True).distinct()
connection.close()
t1.start()

这个问题,在window系统下是正常的,部署到linux下后就会报错mysql is gone way等等,以前没有时间看,今天补了一下这方面的知识。
Linux系统在Fork创建子进程时引入了“写时复制”技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。在创建子进程之后,两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。当父、子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间。
通过multiprocessing.Process在linux中创建的子进程,会复制到父进程内存中留存的sockets,也就是说,子进程向数据库发起操作,是基于父进程socket已经和数据库完成连接的情况下进行的。如果父进程连接断开,那么子进程将无法进行数据库操作。
对我这边的情况就是:
在linux中,主进程不关闭数据库连接,开启子进程,当主进程完成数据库操作后,就断开连接了,此时子进程无法对数据库进行操作就报错了;而主进程主动关闭数据库连接后,子进程自己创建一个不依赖主进程的socket连接,这样,即使主进程结束了,子进程也不会报错
在windows中,关不关数据库连接都没有影响,因为主进程和子进程没有任何联系。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 6,180评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,817评论 1 32
  • 一. 操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式: 向下管理硬件,向上提供接口.操作系统进行...
    月亮是我踢弯得阅读 6,217评论 3 28
  • 成长路上,荆棘与沼泽遍布,狂风与雷电相舞,是为此愤愤然而畏葸不前?还是练好本领勇敢迎战? 不要去希冀通往云层的路途...
    傲气冲天925阅读 1,538评论 0 0
  • 今天下班的时候,阳光还很明亮 ,坐在车上,远远望去红红绿绿一片。煞是惹眼。 橙红色的花朵,鲜绿的羽状叶子, 远远看...
    巴黎小青蛙阅读 504评论 0 1

友情链接更多精彩内容