在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)

相关文章:

  • 2022-01-11
  • 2022-12-23
  • 2021-08-31
  • 2022-01-26
  • 2021-08-14
  • 2021-11-03
  • 2021-08-31
猜你喜欢
  • 2022-12-23
  • 2021-11-18
  • 2021-09-15
  • 2022-12-23
  • 2021-07-16
相关资源
相似解决方案