我有一个多线程程序,在主程序和每个线程中使用pymongo。由于pymongo会为每个连接创建2个线程,我怎样才能找到由pymongo创建的线程数?如何获得pymongo活动线程的数量?
threading.activeCount()
我可以通过上面的命令获得总活动线程,但我不知道pymongo属于多少。
我有一个多线程程序,在主程序和每个线程中使用pymongo。由于pymongo会为每个连接创建2个线程,我怎样才能找到由pymongo创建的线程数?如何获得pymongo活动线程的数量?
threading.activeCount()
我可以通过上面的命令获得总活动线程,但我不知道pymongo属于多少。
在MongoDB shell中有一个命令:db.serverStatus()
。
它给出了包括连接在内的服务器状态。你可以在你的Python代码pymongo
使用它:
con = db.command("serverStatus")["connections"];
Current_con = con["current"] #Int Value.
注意con
是一个JSON对象。
PyMongo不会为每个连接创建两个线程。每个MongoClient都有一个用于定期清理任务的后台线程,还有一个用于监视MongoDB服务器状态的后台线程。所以,如果你创建默认MongoClient它连接到一台服务器上的本地主机:27017,一共有两个线程产卵:
c = MongoClient("mongodb://localhost")
如果你这样做:
c = MongoClient("mongodb://host1,host2/?replicaSet=my_replica_set")
然后PyMongo会发现副本集成员并产生线程来监视它们,直到它发现整个集合。所以,如果你有一个三人组,PyMongo派生四个线程。
简短的回答,知道线程PyMongo已经开始数,那么你应该定期执行这样的:
len(c.nodes) + 1
也就是服务器数量PyMongo知道的,加上一个清除线程。
A brief explanation is here, where the FAQ says "MongoClient spawns multiple threads to run background tasks such as monitoring connected servers."我还写了一个very thorough explanation of PyMongo's use of threads here,主要用于未来的PyMongo维护者。