我有一台运行IP控制器的服务器和12台IP引擎。我使用SSH从笔记本电脑连接到控制器。我使用负载平衡视图接口(在非阻塞模式下)向控制器提交了一些作业,并将消息ID存储在由apply_async()方法返回的Asyc Result对象中。
我意外丢失了作业的消息ID,并想知道是否有从Hub数据库中检索作业ID(或结果)的方法。我为Hub使用SQLite数据库,我可以使用rc.db_query()方法,但我不知道该找什么。
有没有人知道如何仅针对我提交的作业的消息ID查询Hub数据库?如果我无法访问AsyncHubResult对象(或其消息ID),那么从Hub检索作业的最简单方法是什么?
谢谢!
答案 0 :(得分:1)
如果没有消息ID,您可能很难找到合适的任务,除非提交的任务太多了。
查询基于MongoDB(当您使用mongodb时它是一个直通,并且为sqlite实现了一个简单运算符的子集)。
快速摘要:查询是一个词典。如果使用文字值,则它们是相等性测试,但您可以将dict值用于比较运算符。
您可以按日期搜索任何时间戳:
例如,要查找昨天提交的任务:
from datetime import date, time, timedelta, datetime
# round to midnight
today = datetime.combine(date.today(), time())
yesterday = today - timedelta(days=1)
rc.db_query({'submitted': {
'$lt': today, # less than midnight last night
'$gt': yesterday, # greater than midnight the night before
}})
或1-4小时前提交的所有任务:
found = rc.db_query({'submitted': {
'$lt': datetime.now() - timedelta(hours=1),
'$gt': datetime.now() - timedelta(hours=4),
}})
根据结果,您可以查看client_uuid
之类的密钥来检索给定客户端实例(例如单个笔记本或脚本)提交的所有消息:
client_id = found[0]['client_uuid']
all_from_client = rc.db_query({'client_uuid': client_uuid})
由于您此时只对结果感兴趣,因此您可以指定keys=['msg_id']
仅检索消息ID。然后我们可以使用这些msg_ids来获取单个客户端会话产生的所有结果:
# construct list of msg_ids
msg_ids = [ r['msg_id'] for r in rc.db_query({'client_uuid': client_uuid}, keys=['msg_id']) ]
# use client.get_result to retrieve the actual results:
results = rc.get_result(msg_ids)
此时,您已经获得了所有结果,但是您已经失去了哪个结果来自哪个执行的关联。没有很多信息可以帮助您,但您可以通过类型,时间戳或者从给定会话中选择9个最终项目来判断。