我没有看到让调度程序忘记以前在执行的dask图中使用的密钥的方法。最小的例子:
client = Client("127.0.0.1:8786")
def f():
raise KeyError()
dsk = {'A': (f,)}
client.get(dsk, 'A') # raises KeyError
如果我回去修复错误并重新提交图表:
def f():
return True
dsk = {'A': (f,)}
client.get(dsk, 'A') # still raises KeyError, but:
dsk = {'A1': (f,)}
client.get(dsk, 'A1') # returns True
我理解这是正确的行为,因为f已经被pickle并像初始get调用那样被发送到调度程序。有没有办法可以让调度程序在重新提交之前忘记'A'(没有完全重启)?
答案 0 :(得分:0)
这里看起来有两个问题:
一旦没有未来指向它们,调度程序 会非常积极地清除密钥。在这种情况下,看起来在get
调用中引发的KeyError和traceback维护对临时未来的引用,这是不幸的,因为它还维护了一个循环引用(我认为这是一个bug )。如果你能够清理它们,那么事情可能会很好。
我打算建议您明确清除状态创建和取消未来
from dask.distributed import Future
Future('A').cancel()
不幸的是,对于您而言,目前的政策似乎是记住过去取消的例外情况。您可以考虑raising an issue for this
除非他们与某些其他图表调度系统集成,否则很少会看到人们使用自定义图表。大多数用户使用dask.delayed来处理所有这些问题。在这种情况下,dask.delayed将为您构建一个新密钥,就像您在A1
示例中所做的那样,但它将全部隐藏在舒适的可用性层之后。