繁体   English   中英

time.sleep() 方法必须在 notebook 和 dask 分发中重新加载

[英]time.sleep() method has to be reloaded in notebook and dask distributed

我正在做一个基本的 dask 分布式教程,并注意到一个奇怪的行为。

from dask.distributed import Client
client = Client(cluster)  # Connect to cluster

然后在我的笔记本中,定义了以下函数

import time
def square(x):
    time.sleep(2)
    return x ** 2

def neg(x):
    time.sleep(2)
    return -x

使用以下单元启动作业

A = client.map(square, range(10))
B = client.map(neg, A)
total = client.submit(sum, B)
%time total.result()

第一次执行上述单元格时,一切运行良好,挂墙时间为 20s。 但是如果我重新运行单元格,挂墙时间只有几毫秒......

为了让事情再次正常运行,我必须重新运行导入时间、def square()、def neg() 单元格...

我不明白这种行为。

我会理解必须关闭然后重新启动客户端,但重新定义这两个功能?

是的,情况有点微妙。

Dask 将分配给它跟踪的对象,在本例中为期货ABtotal 它们具有取决于功能和 arguments 传递的密钥。 此外,只要至少有一个未来指向它,未来就会留在集群的 memory 中。 所以当你重复

A = client.map(square, range(10))

(或者,比方说,第一个,看起来像submit(square, 0) ) Dask 将为操作构建密钥,并在提交时意识到已经有这个确切的结果的结果,所以工作将不要重复 - 它只会得到以前的结果。

请注意,变量A的清理,它保存了以前的未来,发生分配新版本的A之后,所以总是有对未来的引用,并且集群不会从 memory 中删除它。

如果你重新定义函数,Dask 会给它们新的键,并且不会使用之前保存在集群中的结果。 Dask doesn't actually know the contents of a function (which haven't changed) only that the function is not the same object as before (ie, it is at a different memory location).

最后一点:在笔记本中执行有时更难考虑,因为当您重新执行一个单元格或 go 回到前一个单元格时,您在屏幕上看到的并不完全是解释器处理的输入顺序。 在代码文件 (.py) 中运行相同的东西可能是有益的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM