如果我有一个可变对象,让我们说一个dict,dask如何处理它作为延迟函数的输入?特别是如果我在延迟通话之间更新dict?
我尝试了以下示例,这似乎表明正在进行某些复制,但是您能详细说明dask究竟在做什么吗?
In [3]: from dask import delayed
In [4]: x = {}
In [5]: foo = delayed(print)
In [6]: foo(x)
Out[6]: Delayed('print-73930550-94a6-43f9-80ab-072bc88c2b88')
In [7]: foo(x).compute()
{}
In [8]: p1 = foo(x)
In [9]: x['a'] = 1
In [10]: p2 = foo(x)
In [11]: p1.compute()
{}
In [12]: p2.compute()
{'a': 1}
答案 0 :(得分:1)
Dask不支持可变输入。 Dask期望输入不会改变。 Dask还希望函数不会异地改变输入。
事实证明,同时很难同时支持变异和弹性。
在这种情况下,看起来dask已将您的字典解构为另一个对象。在这种情况下,字典是特殊的。我不希望大多数可变对象的这种行为
In [1]: from dask import delayed
In [2]: x = {}
In [3]: foo = delayed(print)
In [4]: p1 = foo(x)
In [5]: dict(p1.__dask_graph__())
Out[5]: {'print-26d52543-57fc-4873-9722-1a8fd2f1641c': (<function print>, (dict, []))}