dask 的行为 client.submit
Behaviour of dask client.submit
用下面的例子:
from random import random
def add_random(x):
return x + random()
results = []
for i in range(200):
results.append(client.submit(add_random, 2))
results[0]
我注意到结果中的所有未来都与 results[0]
具有相同的键。因此,results
中的所有个体 result
都具有相同的值。
另一方面,如果我让每个函数调用都是唯一的:
def addone(x, i):
return x + 1
results = []
for i in range(200):
results.append(client.submit(addone, 2, i))
results[0]
每个未来都有一个唯一的键,results
列表中的所有 result
都是唯一的。
这是预期的行为吗?我最初假设在第一种情况下,我应该得到我在第二种情况下得到的结果。
默认情况下,Dask 假定传递给它的所有函数都是确定性的,即给定相同的输入它们会产生相同的输出。这有助于我们消除重复工作。
对于您的函数,这不是真的,它 returns 由于 random()
调用而给定相同输入的不同值。您可以通过指定要提交的 pure=False
关键字参数来覆盖确定性行为。
future = client.submit(func, x, pure=False)
用下面的例子:
from random import random
def add_random(x):
return x + random()
results = []
for i in range(200):
results.append(client.submit(add_random, 2))
results[0]
我注意到结果中的所有未来都与 results[0]
具有相同的键。因此,results
中的所有个体 result
都具有相同的值。
另一方面,如果我让每个函数调用都是唯一的:
def addone(x, i):
return x + 1
results = []
for i in range(200):
results.append(client.submit(addone, 2, i))
results[0]
每个未来都有一个唯一的键,results
列表中的所有 result
都是唯一的。
这是预期的行为吗?我最初假设在第一种情况下,我应该得到我在第二种情况下得到的结果。
默认情况下,Dask 假定传递给它的所有函数都是确定性的,即给定相同的输入它们会产生相同的输出。这有助于我们消除重复工作。
对于您的函数,这不是真的,它 returns 由于 random()
调用而给定相同输入的不同值。您可以通过指定要提交的 pure=False
关键字参数来覆盖确定性行为。
future = client.submit(func, x, pure=False)