背景:
我正在开发一个项目,使用Django和Postgres数据库。我们还使用了mod_wsgi,因为我的一些网络搜索提到了它。在Web表单提交时,Django视图启动一个需要大量时间(超过用户想等待的时间)的作业,因此我们通过后台的系统调用启动作业。现在正在运行的作业需要能够读取和写入数据库。由于这个作业花费的时间很长,我们使用多进程并行运行部分作业。
问题:
顶层脚本具有数据库连接,当它生成子进程时,似乎父级的连接对子进程可用。然后会出现有关必须在查询之前调用SET TRANSACTION ISOLATION LEVEL的异常。研究表明,这是由于尝试在多个进程中使用相同的数据库连接所致。我找到的一个线程建议在子进程开始时调用connection.close(),这样Django将在需要新连接时自动创建一个新连接,因此每个子进程将具有唯一的连接 - 即不共享。但是这对我没有起作用,因为在子进程中调用connection.close()会导致父进程抱怨连接丢失。
其他发现:
我读到的一些东西似乎表明你实际上不能这样做,而且多进程、mod_wsgi和Django不能很好地协同工作。我想这似乎很难相信。
有人建议使用celery,可能是一个长期的解决方案,但目前我无法安装celery,因为还需要一些批准过程。
在SO和其他地方找到了几个关于持久数据库连接的参考资料,我认为这是一个不同的问题。
还发现了关于psycopg2.pool和pgpool以及某种关于bouncer的内容。诚然,我没有完全理解我读到的大部分内容,但它当然没有引起我的注意,因为那不是我要找的东西。
当前的“解决方法”:
目前,我已经恢复到逐个运行事物的方式,这样可以工作,但速度比我想要的慢。
任何建议如何使用多进程并行运行?如果我可以让父进程和两个子进程都有独立的数据库连接,似乎事情会变得很好,但我无法获得这种行为。谢谢,对于长度很抱歉!