检查带电机的服务器(Mongodb& Tornado)

时间:2016-05-27 15:16:47

标签: python mongodb tornado pymongo tornado-motor

我需要创建一个函数来检查以确保Mongo服务器正在使用ping函数运行。我在那里设置了客户端(配置文件包含带端口号的字典)

   clientList = []
for value in configuration["mongodbServer"]:
    client = motor.motor_tornado.MotorClient('mongodb://localhost:{}'.format(value))
    clientList.append(client)

然后我运行此功能:

class MongoChecker(Checker):

formatter = 'stashboard.formatters.MongoFormatter'
def check(self):
 for x in clientList:
        if x.ping:
            return x.ping

我得到的错误:

 yielded unknown object MotorDatabase(Database(MongoClient([]), 'ping'))\n",

我认为我的问题是我使用ping函数错了。我找不到关于该功能的任何其他文档或任何其他类型的功能,以检查服务器是否仍在运行。如果有人知道使用Motor监控状态的更好方法,我会打开。谢谢!

1 个答案:

答案 0 :(得分:2)

首先,没有“ping”功能。因此,MotorClient认为您正在尝试访问名为“ping”的数据库。名为“ping”的数据库显示在“未知对象”异常中。对于所有MongoDB命令,例如“ping”,只需使用MotorDatabase的command method

其次,Motor是异步的。您必须使用“yield”语句在Tornado协程中使用Motor方法。例如:

@gen.coroutine
def check():
    try:
        result = yield client.admin.command({'ping': 1})
        print(result)
    except ConnectionFailure as exc:
        print(exc)

如果你想同步测试它,你可以运行IOLoop足够长的时间来完成协程:

from pymongo.errors import ConnectionFailure
from tornado import gen
from tornado.ioloop import IOLoop

import motor.motor_tornado

client = motor.motor_tornado.MotorClient()
IOLoop.current().run_sync(check)

有关Tornado协同程序的介绍,请参阅Refactoring Tornado CoroutinesTornado documentation