[英]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 将键分配给它跟踪的对象,在本例中为期货A
、 B
和total
。 它们具有取决于功能和 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.