dask.delayed如何处理可变输入?

时间:2018-02-06 19:06:11

标签: python dask dask-delayed

如果我有一个可变对象,让我们说一个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}

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, []))}