使用PyMongo有多重,使用MongoClientwith的实例时必须小心 fork()

https://api.mongodb.com/python/3.9.0/faq.html

在Unix系统上,多处理模块使用产生程序fork()。使用MongoClientwith的实例时必须小心 fork()。特别是,绝不能将MongoClient实例从父进程复制到子进程。相反,父进程和每个子进程必须创建自己的MongoClient实例。例如:

# Each process creates its own instance of MongoClient.
def func():
    db = pymongo.MongoClient().mydb
    # Do something with db.

proc = multiprocessing.Process(target=func)
proc.start()

永远不要这样做:

client = pymongo.MongoClient()

# Each child process attempts to copy a global MongoClient
# created in the parent process. Never do this.

def func():
db = client.mydb
# Do something with db.

proc = multiprocessing.Process(target=func)
proc.start()

由于fork(),线程和锁之间固有的不兼容性,从父进程复制的MongoClient实例在子进程中极有可能出现死锁 。如果有可能发生这种死锁,PyMongo将尝试发出警告。

在实例化MongoClient实例时加上参数connect=False,例如:

from pymongo import MongoClient
client = MongoClient(host='localhost', port=27017, connect=False)
posted @ 2020-08-13 16:55  justblue  阅读(428)  评论(0编辑  收藏  举报