Python Pymongo中Connection()与MongoClient()差别

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

且看分析以下:git

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.pythis

62.5780000687spa

 

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

 

非常疑惑,因而查了pymongo的文档,原来二者有个选项的默认行为不一样:orm

  

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
相关文章
相关标签/搜索