使用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)