normalize_token

时间:2017-10-11 14:32:48

标签: python dask

我通过以下测试获得了意外行为。很可能我可能误解了一些东西,但目前我已经没有想法并会欣赏输入。考虑以下测试:

# test passing an object
from dask import delayed, compute, get, set_options
# for testing the caching
from dask.base import normalize_token
from dask.cache import Cache

set_options(delayed_pure=True)


def test_object_hash():
    cache_tmp = cache.Cache(1e9)
    # test that object hashing is working
    class Foo:
        a = 1
        b = 2

    @normalize_token.register(Foo)
    def tokenize_foo(self):
        return normalize_token((self.a, self.b))

    global_list = list()

    def add(foo):
        print("here")
        global_list.append(1)
        return foo.a + foo.b

    # first, verify the hashes are the same
    myobj = Foo()
    first = delayed(add)(myobj)
    myobj2 = Foo()
    second = delayed(add)(myobj2)
    assert first.key == second.key

    # don't test with streams since it should be the same result
    # this better highlights the problem
    compute(first, get=get)
    compute(second, get=get)
    assert global_list == [1]

第一个assert语句通过,但第二个没有通过。我认为dask缓存了结果,因此使用相同的dask密钥的计算只计算一次。这段代码中是否缺少某些内容? 请注意,这已在dask.distributed中使用,因此这可能是API中的一个误解。

谢谢!

1 个答案:

答案 0 :(得分:1)

我回答了自己的问题。我没有正确注册缓存。我不得不添加一行:     cache.register()

如果有人对此有其他评论,我很高兴听到。感谢。