背景:
我在做一个项目,用姜戈和 Postgres 数据库。我们还使用 mod _ wsgi 以防万一,因为我的一些网络搜索引擎已经提到了它。在 Web 表单提交时,Django 视图启动一个需要大量时间的作业(比用户希望等待的时间要长) ,因此我们通过后台的系统调用启动该作业。现在正在运行的作业需要能够对数据库进行读写操作。因为这个作业需要很长时间,所以我们使用多处理来并行运行它的一部分。
问题:
顶级脚本有一个数据库连接,当它产生子进程时,似乎父进程的连接对子进程可用。然后有一个例外,在查询之前必须调用 SET 事务隔离 LEVEL。研究表明,这是由于试图在多个进程中使用相同的数据库连接造成的。我发现一个线程建议在子进程的开始调用 connection.close () ,这样 Django 就会在需要连接时自动创建一个新连接,因此每个子进程都有一个唯一的连接——即不共享。这对我来说不起作用,因为在子进程中调用 connection.close ()会导致父进程抱怨连接丢失。
其他发现:
我读到的一些内容似乎表明您不能真正做到这一点,而且多处理、 mod _ wsgi 和 Django 不能很好地协同工作。我觉得这很难让人相信。
一些人建议使用芹菜,这可能是一个长期的解决方案,但我无法得到芹菜安装在这个时候,等待一些审批程序,所以不是一个选择目前。
在 SO 和其他地方找到了一些关于持久数据库连接的参考资料,我认为这是一个不同的问题。
还找到了一些关于 Psycopg2.pool 和 pgpool 的资料,还有一些关于保镖的资料。不可否认的是,我并不理解我在这些文章中读到的大部分内容,但是它们并没有跳出来成为我正在寻找的东西。
现时的「工作间」 :
到目前为止,我已经恢复到只是串行运行事情,它工作,但比我想要的慢。
对于如何使用多处理并行运行有什么建议吗?看起来如果父母和两个孩子都能和数据库有独立的联系,一切都会好起来的,但我似乎不能理解这种行为。
谢谢,抱歉让你久等了!