IPython 并行:如何从 IPcontroller 恢复作业 ID

IPython parallel : how to recover job IDs from IPcontroller

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

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

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

谢谢!

如果没有消息 ID,您可能很难找到正确的任务,除非提交的任务不多。

查询基于MongoDB(当你使用mongodb时它是一个passthrough,并且为sqlite实现了一个简单运算符的子集)。

快速总结:一个查询就是一个字典。如果您使用文字值,它们是相等性测试,但您可以使用字典值作为比较运算符。

您可以按日期搜索任何时间戳:

  • 提交:到达控制器
  • 开始:到达引擎
  • 已完成:在引擎上完成

比如查找昨天提交的任务:

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)

此时,您拥有所有结果,但您失去了哪些结果来自哪个执行的关联。没有太多信息可以帮助您,但您可以通过类型、时间戳或可能 select 给定会话的 9 个最终项目来判断。