2013-05-30 3 views
1

У меня есть скрипт мониторинга, проверяющий экземпляр mongodb один раз в минуту, и вам нужен хороший способ подключения, выполнить простой запрос и вернуть его в течение 10 секунд или просто таймаутом в некоторых предсказуемым образом, если потребуется больше 10 секунд и позвольте мне поймать эту ошибку/исключение.Проверка состояния сервера с помощью pymongo с таймаутом

В соответствии с документацией pymongo вы не можете установить тайм-аут запроса, только тайм-аут сокета и соединения (который, кажется, работает нормально). Есть ли какое-нибудь обходное решение?

Поток программы заключается в следующем:

  1. Подключение к MongoDB
  2. Выполнение простого find() запроса для проверки последнего обновленного документа (используется для статистики)
  3. закрыть соединение.

# 1 всегда работает нормально, но весь запрос истекает на # 2, и я не могу поймать его в пределах моего собственного наложенного 10-секундного лимита.

Блокировка, по-видимому, происходит в часы пик из-за ряда одновременных запросов уменьшения количества карт. Мы используем mongodb 2.4.3.

+0

, если это индексированная find(), она должна заканчиваться быстрее, чем таймаут, тем более, что вы запрашиваете только одну запись! –

ответ

1

Вы можете использовать socketTimeoutMS при создании mongo_client или вы можете добавить его в ваш найти.

Например, в следующем коде я подключаюсь к локальному mongod, а затем моделирую длинный запрос с 10-секундным сном в функции $ where (не рекомендуется). На 1 секунда socketTimeoutMS вызывает вызов к сбою с pymongo.errors.AutoReconnect: истекло:

from pymongo import MongoClient 
client = MongoClient('localhost', 27017) 
if client.test.ing.count() == 0: 
    client.test.ing.insert({}) 
client.test.ing.find({ '$where' : 'function() { sleep(10000); return True; }' } , socketTimeoutMS=1000).count() 

Я надеюсь, что помогает.

Примечание 1: если коллекция пуста, то клиент немедленно возвращает

Примечание 2: если вы просто получить курсор и ничего не делать, то вы не получите сообщение об ошибке

+1

Дело в том, что сокет не медленный. Это сама база данных, что означает, что запрос на соединение, отправку и (в конечном счете) быстрый запрос на сокет. Это запрос, после отправки его на сервер, который занимает много времени. 'socketTimeoutMS' не изменяет этого. pymongo упоминает тайм-аут курсора, но, по-видимому, в python тайм-аут для него не поддерживается (я видел его на PHP и на другом языке) –

Смежные вопросы