Django multiprocessing多进程操作数据库OperationalError报错详解
背景
使用django进行后台开发过程中,想利用multiprocessing开启多进程并发操作数据库,结果在执行子进程时,出现报错:django.db.utils.OperationalError: server closed the connection unexpectedly,抱着“春节前也不是那么忙,闲着也有点儿*疼”的想法,对该报错的产生原因进行分析。
测试
测试环境为linux red-hat 6.8系统 + python 3.6 + Django 1.11,后台数据库采用postgressql 9.5.5。
django数据库配置如下:
DATABASES = {
'datamigration': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'dbname',
'USER': 'dbuser',
'PASSWORD': 'passwd',
'HOST': 'IP', #隐去真实IP
'PORT': 'PORT', #隐去真实端口
},
}
测试model如下:
class DataMigrationTask(models.Model):
id_task = models.AutoField(primary_key=True)
service_number = models.CharField(max_length=-1, blank=True, null=True)
um = models.CharField(max_length=-1)
create_date = models.DateTimeField(auto_now_add=True,blank=True, null=True)
class Meta:
managed = False
db_table = 'data_migration_task'
app_label = 'datamigration'
测试view函数如下:
from multiprocessing import Process
import time
def test_select(query_times, process_num=0):
print('child process {} begin'.format(process_num))