详解多线程Django程序耗尽数据库连接的问题
作者:赖勇浩 发布时间:2024-01-23 02:27:14
Django的ORM是非常好用的,哪怕不是做Web项目也值得一用,所以网上也可以找到不少使用 Django 开发非Web项目的资料,因为除了ORM之个,命令行、配置文件等组件也非常好用。
最近用这种方式开发了一个非Web项目,而且是多线程的。有N个工作线程从DB中获取jobs,并把结果写回DB。简单来说就是这样。
项目运行一段时间后,发现数据库连接耗尽了,幸好内存大,然后一直往上调,最后连接数都上九千多一万了。耗尽连接数的时候,PostgreSQL 会出现类似这样的错误:
FATAL: remaining connection slots are reserved for non-replication superuser connections
然后就各种看文档、代码,找问题,其中艰难略下不表,最后大概是这么些个知识点:
Django里的数据库连接是放在线程的 local() 实例中的。
任何时候,需要一个数据库连接的话,Django就会创建一条出来,或者用本线程已有的那条。
如果是Web项目,在请求结束的时候,Django会去关闭掉连接。是的,没有连接池。
因为我们是非Web项目,所以不存在请求结束事件,所以一直没的关闭连接。但本来这个应该也不会造成问题的,因为没关闭就一直用呗,但不知道哪里出了问题,会出现连接泄漏,所以连接数据会一直增长。
最后的解决方案是找时机主动关闭数据库连接,具体到我们项目,就是每次工作线程完成一个任务后,就把它相关的连接关掉,因为我们用的是 ThreadPoolExecutor
,所以Django很容易做到这一点。
重点代码如下:
from django.db import connections
def on_done(future):
# 因为每一个线程都有一个 connections,所以这里可以调用 close_all(),把本线程名下的所有连接关闭。
connections.close_all()
def main():
# ...
with ThreadPoolExecutor() as executor:
while True:
future = executor.submit(do, get_a_job())
future.add_done_callback(on_done)
主动关闭后,数据库连接数降到与工作线程数相近,并保持稳定。
来源:https://blog.csdn.net/gzlaiyonghao/article/details/82959426


猜你喜欢
- 因为之前写的不太详细这次修改补充一下,但是我的mysql之前的版本是8.0现在的版本是5.7所以截图有些怪,不过步骤一模一样,2个版本我都试
- 大家好,我是朱小五。大家如果看过我的书《快学Python:自动化办公轻松实战》,会发现Python操作PDF文档内容,主要围绕PDF文档的内
- 本文以Python3.8为例1、 compileall py文件转换为pyc1.1、compileall命令行模式不需要额外安装,pytho
- 从Python字符串中删除最后一个分号或者逗号第一种方法使用 str.rstrip() 方法从字符串中删除最后一个逗号,例如 new_str
- Dreamweaver一直是不少网友钟情的网页设计工具,除了它强大的动态效果制作能力外,方便简洁的操作界面更是独具特色,下面我们将以最新版本
- XMLHttpRequest的兼容代码功能结构上大体没有什么变动主要处理了这么几条:1.不同浏览器的创建方式2.事件大小写问题(ie7的XM
- 一、ZeroMQ概述 ZeroMQ(又名ØMQ,MQ,或zmq)像一个可嵌入的网络库,但其作用就像一个并发框
- 本文研究的主要是PyQt5主窗口动态加载Widget的代码示例,具体如下。我们通过Qt Designer设计两个窗口,命名为主窗口(Main
- 需求说明:通过在界面上输入春联的上、下批和横批汉字从而生成春联图像,最后将春联图片保存。有实际需要的还可以将春联打印。实现过程:实现思路是先
- pytorch的广播语义(broadcasting semantics),和numpy的很像,所以可以先看看numpy的文档:1、什么是广播
- 说明1、导入模块pyplot,并指定别名plt,以避免重复输入pyplot。模块化pyplot包含许多用于制作图表的功能。2、将绘制的直线坐
- 一、Mock介绍1、什么是Mock模拟接口接口Mock测试:在接口测试中,对于某些不容易构造或者不容易获取的接口,可以用一个模拟接口来代替2
- 原来在一本书上看到过,从多个tfrecord文件中读取数据的方法,今天想用在网上找了一下,现在记录一下,免得自己以后忘记了又不好找,tfre
- 1 本地包声明包是Go程序的基本单位,所以每个Go程序源代码的开始都是一个包声明:package pkgName这就是包声明,pkgName
- 0 前言安装:pip install pypiwin32 1 Excel的APIimport win32com.client as win3
- 本文实例为大家分享了Python感知器算法实现的具体代码,供大家参考,具体内容如下先创建感知器类:用于二分类# -*- coding: ut
- 本文章以一个表为例,要转多个表则可将DataSet关联多个表,下面给出完整代码,包括引用以及main函数与复制函数。要说明的是,必须先用Sq
- python数据与matlab互通SciPy有时候需要利用python进行科学计算,但需要Matlab进行交互式画图,因此需要掌握pytho
- Notepad++ 是一款非常有特色的编辑器,软件小巧高效,支持27种编程语言,通吃C,C++ ,Java ,C#, XML, HTML,
- 目录问题描述解决方案问题分析问题描述在 MySQL 中使用 delete 语句删除数据之后,监控视图中可用的磁盘空间没有增加,磁盘使用率没有