zoukankan      html  css  js  c++  java
  • 使用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)
  • 相关阅读:
    功能规格说明书
    绝望的作业
    php闭包
    php isset emtpy
    PHP超级全局变量、魔术变量和魔术函数
    死锁的一个例子
    php session cookie
    http状态码301、302
    php浮点数
    学过的设计模式
  • 原文地址:https://www.cnblogs.com/justblue/p/13497379.html
Copyright © 2011-2022 走看看