在ipython并行启动新任务时的通知

时间:2017-03-07 22:13:04

标签: ipython-parallel

有关ipyparallel最佳实践的几个问题。我正在尝试用它来实现一个需要大约运行15的模型的蒙特卡罗框架。我们的想法是运行N个引擎(通过SLURM),并有一个“主”进程,它将所有必需的任务异步排队并忙于等待完成,用每次运行的状态更新一个sqlite数据库。

我想知道何时将任务分配给引擎,以便我可以在数据库中跟踪其状态。我尝试使用AsyncResult实例来获取msg_id并查询任务数据库,但在任务完成之前,“started”字段不会更新。

似乎应该有办法接收此通知,或者至少在引擎工作时查询集线器。

另外,在长时间运行的任务中,我必须做些什么来避免引擎心跳超时吗?这是client.spin_thread()的目的吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我使用publish_data回答了我自己的一部分问题。这个想法是,而不是只是打电话给我的主要工作人员"在每个引擎中的函数,我在主工作函数之前和之后调用publish_data()来设置客户端可以看到的状态。例如:

def wrapper(run_id, argDict):
    from ipyparallel.engine.datapub import publish_data

    publish_data({run_id : 'running'})
    status = runMonteCarloTrial(argDict)   # runs for ~15 minutes
    publish_data({run_id : status})
    return status

"主人"任务电话:

ar = client.map_async(wrapper, listOfArgDicts) 

然后我循环ar直到所有AsyncResults完成,检查ar.data以读取已发布的数据以识别正在运行的试验并将试验结果保存到sqlite3数据库。

这种通用方法适用于简单的测试用例。我还没有探索长时间运行函数调用的超时问题。