我正在使用dask.distributed
运行群集。目前,我使用Jupyter笔记本将任务提交到集群,我将其用作GUI。
相应的笔记本单元格包含以下代码。
%pylab inline
%load_ext autoreload
%autoreload 2
from distributed import progress
sys.path.append('/path/to/my/python/modules/on/NAS')
import jobs
jobid = jobs.add_new_job(...)
r = jobs.start_job(jobid)
progress(r)
jobs
是我的python模块的名称。 jobs.add_new_job
返回带有作业标识符的字符串。 jobs.start_job
会返回distributed.client.Future
的列表。这份工作的最终结果是一份包含一些数字和一些PDF格式的报告。
现在,我想实现一个作业队列,其中包含一些关于现在正在处理什么以及正在等待什么的指示。
我的目标是实现以下方案。
我的团队成员为新工作准备一些数据,然后在浏览器中打开Jupyter笔记本,在调用add_new_job
的单元格中输入作业参数,然后执行此单元格,然后关闭该页面并等待直到计算完成。他也可以打开页面并观察进度。
到目前为止,我发现如果我通过运行一次单元格并等到一切都完成后将一个作业提交到集群,那么一切都像魅力一样。
如果我尝试通过简单地编辑单元代码并再次运行它来再提交一份作业,则群集将停止计算首次提交的作业。我对此的解释是删除了r
,它的析构函数会向集群发送取消请求。
如果我尝试通过复制笔记本来提交新作业,则会在浏览器中打开一个新的空白页面,然后需要很长时间才能加载笔记本并允许用户执行任何操作。
此外,由progress
显示的进度条通常会自动消失。
我已经阅读过关于JupyterHub的内容,但目前在我看来,使用它就像是一支带有重型火炮的射击麻雀,应该有更简单的方法。
答案 0 :(得分:1)
我对此的解释是删除r并且其析构函数向集群发送取消请求
这是对的。避免这种情况的一种简单方法是将r
添加到每次运行单元格时未删除的结果集
-- cell 1 --
results = []
-- cell 2 --
import jobs
jobid = jobs.add_new_job(...)
r = jobs.start_job(jobid)
results.append(r)
progress(r)