【问题标题】:pymongo.MongoClient after os.forkos.fork 之后的 pymongo.MongoClient
【发布时间】:2024-01-23 12:07:01
【问题描述】:

MongoReplicaSetClient docs 明确指出,您不能fork 进程并在两个进程中使用MongoReplicaSetClient

问题:是否保证MongoClient 在进程分叉后可以工作?还是在每个进程中单独启动与数据库的单独连接更好?

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

我也不明白,如果任何子进程先于其他进程退出,网络连接是否会关闭(简单的文章表明它没有,但为什么而且总是这样?)。

【问题讨论】:

    标签: unix connection fork pymongo


    【解决方案1】:

    MongoClient 3.2 可以在 fork() 之后工作,但只能在某些平台上工作。这是文档中的一个 sn-p:http://api.mongodb.org/python/current/faq.html#using-pymongo-with-multiprocessing

    在使用多处理时需要注意一些事项 PyMongo。在某些平台上(在这里定义) MongoClient 必须是 如果在孩子中使用 MongoClient,则使用 connect=False 初始化 进程在分叉之前被初始化。如果 connect 不能为 False, 那么 MongoClient 必须在分叉后初始化。

    这是因为 CPython 在调用之前必须获取锁 获取地址信息()。如果 MongoClient 的 parent 会发生死锁 进程分叉(在主线程上),而它的监视器线程在 getaddrinfo() 系统调用。

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

    【讨论】: