libpq
个连接shouldn’t be used by a forked processes,因此当使用multiprocessing
之类的模块或者像FastCGI这样的分支Web部署方法时,请确保在之后创建连接叉子。
从该文档中the link后,导致:
在Unix上,使用开放
libpq
连接分支进程可能会导致不可预测的结果,因为父进程和子进程共享相同的套接字和操作系统资源。因此,不建议使用此类用法,但是从子进程执行exec以加载新的可执行文件是安全的。
但是it seems使用开放套接字分叉进程没有固有的问题。那么,psycopg2
在连接打开时警告不要分叉是什么原因?
我的问题的原因是我看到一个(大概是成功的)multiprocessing approach在分叉之前打开了一个连接。
在某些限制下分叉打开连接也许是安全的(例如,实际上只有一个进程使用了连接等)?
答案 0 :(得分:1)
您的猜测基本上是正确的:只要您不尝试在多个进程中使用连接,就不会在fork之前打开连接。
<德尔> 话虽如此,我认为您误解了您提供的“多处理方法”链接。它实际上演示了在每个孩子中打开一个单独的连接。 (在分叉之前,父母已经打开了一个连接,但它没有在任何孩子中使用。) 德尔>
<德尔> 那里的答案(与问题中的代码相比)给出的改进是重构,以便 - 不是为队列中的每个任务打开新连接 - 每个子进程打开一个连接,然后在多个任务之间共享它在同一个子节点内执行(即连接作为参数传递给Task处理器)。 德尔>
修改强>:
作为一般做法,人们应该更喜欢在使用它的进程中创建连接。在引用的答案中,在分叉之前在父母中创建了连接,然后在孩子中使用。这确实可以正常工作,但也会在父级中打开每个“子连接”,这最多是浪费资源,也是潜在的错误原因。