MongoReplicaSetClient docs明确指出,您无法fork
此过程并在两个流程中使用MongoReplicaSetClient
。
问题:是否保证MongoClient在进程分叉后才能正常工作?或者,是否最好独立地在每个进程中启动与数据库的单独连接?
据我所知,文件描述符cannot be safely used在进程fork之后,因为两个进程共享相同的文件描述结构。但是,这些不是文件,而是网络连接,包含在一些python类中;所以我基本上不知道类似的逻辑是否适用于MongoClient
,或者保证实际上由于某种原因正常工作。
我不明白,如果任何子进程退出其他子进程之前是否会关闭网络连接(简单的写入表明它没有,但是为什么并且总是如此?)。
答案 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会发出警告 发生。