2017-02-18 38 views
0

我有一个多线程程序,在主程序和每个线程中使用pymongo。由于pymongo会为每个连接创建2个线程,我怎样才能找到由pymongo创建的线程数?如何获得pymongo活动线程的数量?

threading.activeCount() 

我可以通过上面的命令获得总活动线程,但我不知道pymongo属于多少。

回答

2

在MongoDB shell中有一个命令:db.serverStatus()

它给出了包括连接在内的服务器状态。你可以在你的Python代码pymongo使用它:

con = db.command("serverStatus")["connections"]; 
Current_con = con["current"] #Int Value. 

注意con是一个JSON对象。

1

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维护者。