多进程连接数据库,开启子进程时,主进程要记得关闭数据库连接
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中,关不关数据库连接都没有影响,因为主进程和子进程没有任何联系。