Django multiprocessing多进程操作数据库OperationalError报错详解

本文详细分析了在Django中使用multiprocessing进行多进程操作时遇到的OperationalError问题,报错原因是子进程继承了父进程的数据库连接导致。通过测试调整CONN_MAX_AGE参数、父进程建立连接的时间以及使用join方法等,探讨了解决方案。
摘要由CSDN通过智能技术生成

背景

使用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))
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值