2

如果我有一个可变对象,例如一个 dict,dask 如何处理将其作为输入传递给延迟函数?特别是如果我在延迟调用之间对字典进行更新?

我尝试了以下示例,这似乎表明正在进行一些复制,但您能详细说明 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}
4

1 回答 1

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, []))}
于 2018-02-06T22:22:16.877 回答