IPython parallel:如何从IPcontroller恢复作业ID

时间:2016-05-30 17:01:21

标签: ipython jupyter ipython-parallel

我有一台运行IP控制器的服务器和12台IP引擎。我使用SSH从笔记本电脑连接到控制器。我使用负载平衡视图接口(在非阻塞模式下)向控制器提交了一些作业,并将消息ID存储在由apply_async()方法返回的Asyc Result对象中。

我意外丢失了作业的消息ID,并想知道是否有从Hub数据库中检索作业ID(或结果)的方法。我为Hub使用SQLite数据库,我可以使用rc.db_query()方法,但我不知道该找什么。

有没有人知道如何仅针对我提交的作业的消息ID查询Hub数据库?如果我无法访问AsyncHubResult对象(或其消息ID),那么从Hub检索作业的最简单方法是什么?

谢谢!

1 个答案:

答案 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个最终项目来判断。