2017-02-18 7 views
0

У меня есть программа с несколькими потоками, которая использует pymongo в основной программе и каждой нити. Поскольку pymongo создаст 2 потока для каждого соединения, как я могу найти количество потоков, созданных pymongo?Как получить количество активных потоков pymongo?

threading.activeCount() 

Я могу получить общие активные темы с помощью команды выше, но я не знаю, сколько принадлежит pymongo.

ответ

2

В оболочке MongoDB есть команда: db.serverStatus().

Дает статус сервера, включая соединения. Вы можете использовать его с pymongo в коде Python:

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.