有关ipyparallel最佳实践的几个问题。我正在尝试用它来实现一个需要大约运行15的模型的蒙特卡罗框架。我们的想法是运行N个引擎(通过SLURM),并有一个“主”进程,它将所有必需的任务异步排队并忙于等待完成,用每次运行的状态更新一个sqlite数据库。
我想知道何时将任务分配给引擎,以便我可以在数据库中跟踪其状态。我尝试使用AsyncResult实例来获取msg_id并查询任务数据库,但在任务完成之前,“started”字段不会更新。
似乎应该有办法接收此通知,或者至少在引擎工作时查询集线器。
另外,在长时间运行的任务中,我必须做些什么来避免引擎心跳超时吗?这是client.spin_thread()的目的吗?
谢谢!
答案 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数据库。
这种通用方法适用于简单的测试用例。我还没有探索长时间运行函数调用的超时问题。