Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django和并行处理:_Python_Mysql_Django_Parallel Processing - Fatal编程技术网

Python Django和并行处理:

Python Django和并行处理:,python,mysql,django,parallel-processing,Python,Mysql,Django,Parallel Processing,版本: Python 3.5.1 Django 1.10 mysqlclient 1.3.10 mysql 5.7.18-0ubuntu0.16.04.1(Ubuntu) Linux Mint 18.1 我有一个大型Django项目,其中有一个安装脚本,可以从一些csv文件向数据库添加一组内容。偶尔,我需要重置所有内容,并重新添加这些文件中的所有内容。此外,一旦添加数据,还需要进行一些后处理。但是,这需要一段时间,因为文件很长,代码中不可避免地存在一些双循环以及许多数据库查询 在许多情况下,

版本:

  • Python 3.5.1
  • Django 1.10
  • mysqlclient 1.3.10
  • mysql 5.7.18-0ubuntu0.16.04.1(Ubuntu)
  • Linux Mint 18.1
我有一个大型Django项目,其中有一个安装脚本,可以从一些csv文件向数据库添加一组内容。偶尔,我需要重置所有内容,并重新添加这些文件中的所有内容。此外,一旦添加数据,还需要进行一些后处理。但是,这需要一段时间,因为文件很长,代码中不可避免地存在一些双循环以及许多数据库查询

在许多情况下,任务是独立的,因此它们应该可以并行运行。我四处寻找并行处理库,并决定使用非常简单的

因此,设置非常简单。我们定义一些并行运行的函数,然后调用
Pool
。简化代码:

def some_func(input):
    #code inserting data into Django here
    pass

with Pool(4) as p:
    p.map(some_func, [1, 2, 3, 4])
但是,运行代码会导致数据库连接错误,如报告的:

看起来不同的线程/内核试图共享一个连接,或者该连接没有传递给工作线程


如何让并行处理与Django数据库操作一起工作?

在谷歌搜索之后,我找到了一个与(2009)相关的老问题:

您好,我最近正在调试类似的问题,并得出了一个结论 (这当然可能是错误的:)多处理和Django DB 关系网不能很好地配合。我最终关闭了Django DB 连接是新流程中的第一件事。它将重新创造一个新的世界 当它需要一个连接时,但该连接将没有对的引用 父级使用的连接

因此,我的
Process.start()
调用一个以以下内容开头的函数:

从django.db导入连接

connection.close()

这解决了我的问题

因此,要解决此问题,请将函数更改为以下内容:

def some_func(input):
    #kill old database connection
    from django.db import connection
    connection.close()

    #code inserting data into Django here
    pass
然后它工作得很好

def some_func(input):
    #kill old database connection
    from django.db import connection
    connection.close()

    #code inserting data into Django here
    pass