Python 使用pymongo检查服务器状态并超时

Python 使用pymongo检查服务器状态并超时,python,mongodb,Python,Mongodb,我有一个监控脚本,每分钟检查一次mongodb实例,需要一个好的连接方式,执行一个简单的查询,让它在10秒内返回,或者在需要10秒以上的情况下以某种可预测的方式超时,让我捕获错误/异常 根据pymongo的文档,您不能设置查询超时,只能设置套接字和连接超时(看起来工作正常)。有什么解决办法吗 程序流程如下所示: 连接到mongodb 执行一个简单的find()查询以检查上次更新的文档(用于统计) 关闭连接 #1总是可以正常工作,但整个请求在#2超时,我无法在自己设定的10秒限制内捕获它 锁似乎发

我有一个监控脚本,每分钟检查一次mongodb实例,需要一个好的连接方式,执行一个简单的查询,让它在10秒内返回,或者在需要10秒以上的情况下以某种可预测的方式超时,让我捕获错误/异常

根据pymongo的文档,您不能设置查询超时,只能设置套接字和连接超时(看起来工作正常)。有什么解决办法吗

程序流程如下所示:

  • 连接到mongodb
  • 执行一个简单的
    find()
    查询以检查上次更新的文档(用于统计)
  • 关闭连接
  • #1总是可以正常工作,但整个请求在#2超时,我无法在自己设定的10秒限制内捕获它

    锁似乎发生在高峰时间,因为有许多并发的map reduce查询。我们正在使用mongodb 2.4.3。

    您可以在创建mongo\u客户端时使用,也可以将其添加到查找中

    例如,在下面的代码中,我连接到本地mongod,然后在$where函数中模拟一个长时间运行的查询(不推荐)。1秒的socketTimeoutMS导致调用失败,出现pymongo.errors.AutoReconnect:timeout

    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:如果您只获取光标,不执行任何操作,则不会出现错误

    您可以在创建mongo_客户端时使用,也可以将其添加到查找中

    例如,在下面的代码中,我连接到本地mongod,然后在$where函数中模拟一个长时间运行的查询(不推荐)。1秒的socketTimeoutMS导致调用失败,出现pymongo.errors.AutoReconnect:timeout

    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:如果您只获取光标,不执行任何操作,则不会出现错误

    如果这是一个索引的find(),它的完成速度应该比超时快,特别是因为您只查询一条记录!如果这是一个索引的find(),它的完成速度应该比超时快,特别是因为您只查询一条记录!问题是,插座不慢。它是数据库本身,这意味着连接、发送查询和(最终)接收查询在套接字上是快速的。将查询发送到服务器后,需要很长时间<代码>socketTimeoutMS不会改变这一点。pymongo确实提到了游标超时,但显然在python中它不支持超时(我在PHP和其他语言中看到过),问题是,套接字并不慢。它是数据库本身,这意味着连接、发送查询和(最终)接收查询在套接字上是快速的。将查询发送到服务器后,需要很长时间<代码>socketTimeoutMS不会改变这一点。pymongo确实提到了游标超时,但在python中显然不支持超时(我在PHP和其他语言中见过)