zoukankan      html  css  js  c++  java
  • Python Pymongo中Connection()与MongoClient()差异

    在git找了几个blog的源码,在学习的过程中,发现有人使用Connection(),有人却在使用MongoClient(),那么到底两者有什么差别呢?

    且看分析如下:

    db = Connection('192.168.1.101', 27017).performance_test 

    #client = MongoClient('192.168.1.101', 27017)
    
    #db = client.performance_test 
    
     db.drop_collection("updates") 
    
    collection = db.updates 
    
    collection.insert({"x": 1}) 
    
    collection.find_one() 
    
    start = time.time() 
    
    for i in range(100000): 
    
            collection.update({}, {"$push" : {"x" : 1}}) 
    
    ...
    

    运行结果: 

    >python test_mongo_conn.py

    8.43799996376

    >python test_mongo_client.py

    62.5780000687

     

    用Connection() 8秒,MongoClient()则花了62秒,这性能相差也太多了。

    很是疑惑,于是查了pymongo的文档,原来两者有个选项的默认行为不同:

      

    class pymongo.connection.Connection([host='localhost'[, port=27017[, max_pool_size=10[, network_timeout=None[, document_class=dict[, tz_aware=False[, **kwargs]]]]]]])

    Write Concern options:

    safe: Connection disables acknowledgement of write operations. Use safe=True to enable write acknowledgement.

    w: (integer or string) If this is a replica set, write operations will block until they have been replicated to the specified number or tagged set of servers. w=<int> always includes the replica set primary (e.g. w=3 means write to the primary and wait until replicated to two secondaries). Implies safe=True.

    wtimeout: (integer) Used in conjunction with w. Specify a value in milliseconds to control how long to wait for write propagation to complete. If replication does not complete in the given timeframe, a timeout exception is raised. Implies safe=True.

    j: If True block until write operations have been committed to the journal. Ignored if the server is running without journaling. Implies safe=True.

    fsync: If True force the database to fsync all files before returning. When used with j the server awaits the next group commit before returning. Implies safe=True.

    safe选项决定操作是“瞬时完成”与“安全操作”,connection()默认是safe=False,即瞬时完成,不等服务器回应,而MongoClient()默认是safe=True,即安全操作,等服务器确认后才继续下一步操作。

    所以一个8秒,一个62秒,这个差距实际上是“瞬时完成”与“安全操作”两者的性能差别。

    当将Connection() 和MongoClient()建立连接时指定相同的safe参数,两者的性能表现是一样的。

    client = MongoClient('192.168.1.101', 27017,safe=False)
    
    #db = Connection('192.168.1.101', 27017,safe=False).performance_test 
    

    结论:Python用Connection()连接时,修改操作速度非常快,而用MongoClient()建立的连接,操作速度慢很多。

    顺便分享账号密码登录的代码: 

    
    
    from pymongo import MongoClient
    client = MongoClient('www.yeayee.com','27017')
    client.database.authenticate("user","password")
    db = client.database
    collection = db.collection
  • 相关阅读:
    @ResponseBody和@RequestBoby的作用
    项目Alpha冲刺Day9
    项目Alpha冲刺Day8
    项目Alpha冲刺Day7
    设计模式第三次作业
    项目Alpha冲刺Day6
    树莓派历程笔记
    项目Alpha冲刺Day5
    django获取ip与数据重复性判定
    在django模板中添加jquery
  • 原文地址:https://www.cnblogs.com/yeayee/p/5390386.html
Copyright © 2011-2022 走看看