【问题标题】:Django and parallel processing:Django 和并行处理:
【发布时间】:2017-11-27 14:39:34
【问题描述】:

版本:

  • 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 文件将一堆内容添加到数据库中。偶尔,我需要重置所有内容,并从这些文件中重新添加所有内容。此外,数据一旦添加,还需要进行一些后处理。然而,这需要一段时间,因为文件很长,并且代码中存在一些不可避免的双循环以及许多数据库查询。

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

因此,设置非常简单。我们定义一些函数并行运行,然后调用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])

但是,运行代码会导致数据库连接错误,如报告hereherehere

_mysql_exceptions.OperationalError: (2013, 'Lost connection to MySQL server during query')

似乎不同的线程/内核正在尝试共享一个连接,或者该连接未传递给工作人员。

如何获得并行处理以使用 Django 数据库操作?

【问题讨论】:

    标签: python mysql django parallel-processing


    【解决方案1】:

    谷歌搜索后,我在the Django Google groups 上找到了一个旧的(2009 年)相关问题:

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

    所以,我的Process.start() 调用了一个以:

    开头的函数

    from django.db import connection

    connection.close()

    这解决了我的问题。

    因此,要解决此问题,请将函数更改为如下所示:

    def some_func(input):
        #kill old database connection
        from django.db import connection
        connection.close()
    
        #code inserting data into Django here
        pass
    

    然后它工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2016-08-14
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多