os.fork之后的pymongo.MongoClient

时间:2014-09-03 09:53:14

标签: unix connection fork pymongo

MongoReplicaSetClient docs明确指出,您无法fork此过程并在两个流程中使用MongoReplicaSetClient

问题:是否保证MongoClient在进程分叉后才能正常工作?或者,是否最好独立地在每个进程中启动与数据库的单独连接?

据我所知,文件描述符cannot be safely used在进程fork之后,因为两个进程共享相同的文件描述结构。但是,这些不是文件,而是网络连接,包含在一些python类中;所以我基本上不知道类似的逻辑是否适用于MongoClient,或者保证实际上由于某种原因正常工作。

我不明白,如果任何子进程退出其他子进程之前是否会关闭网络连接(简单的写入表明它没有,但是为什么并且总是如此?)。

1 个答案:

答案 0 :(得分:1)

MongoClient 3.2可以在fork()之后工作,但仅限于某些平台。以下是doc:http://api.mongodb.org/python/current/faq.html#using-pymongo-with-multiprocessing

的摘录
  

使用多处理时,有几点需要注意   PyMongo。在某些平台上(这里定义)MongoClient必须是   如果在孩子中使用MongoClient,则使用connect = False初始化   在分叉之前初始化过程。如果连接不能为假,   然后必须在分叉后初始化MongoClient。

     

这是因为CPython必须在调用之前获取锁   的getaddrinfo()。如果MongoClient的父级将发生死锁   进程分支(在主线程上),而它的监视器线程在   getaddrinfo()系统调用。

     

如果有可能出现这种死锁,PyMongo会发出警告   发生。