2013-05-30 33 views
1

我有一个监控脚本每分钟检查一次我们的mongodb实例,并且需要一个很好的连接方法,执行一个简单的查询并使其在10秒内返回,或者仅在一些时间内返回可预测的方式,如果它需要超过10秒,让我抓住该错误/例外。使用pymongo检查服务器状态超时

根据pymongo的文档,您不能设置查询超时,只有套接字和连接超时(这似乎工作正常)。有没有解决这个问题的方法?

程序的流程是这样的:

  1. 连接到MongoDB的
  2. 执行一个简单的查询find()检查最近更新的文件(用于统计)
  3. 关闭连接。

#1总是可以正常工作,但是整个请求在#2超时,没有办法让我在自己自己施加的10秒限制内捕获它。

由于许多并发的map-reduce查询,锁定似乎在繁忙时间发生。我们使用的是mongodb 2.4.3。

+0

如果这是一个索引find(),它应该完成比超时更快的方式,特别是因为您只查询单个记录! –

回答

1

当您创建mongo_client可以使用socketTimeoutMS也可以将其添加到您的找到

例如,在下面的代码中,我连接到本地mongod,然后用$ where函数中的10秒睡眠模拟一个长时间运行的查询(不推荐)。 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

事情是,插座不慢。这是数据库本身,这意味着socket,连接,发送查询和(最终)接收查询都很快。这是查询,发送到服务器后,需要很长时间。 'socketTimeoutMS'不会改变这个。 pymongo的确提到了游标超时,但显然在Python中超时不支持它(我已经看到它在PHP和其他语言) –