繁体   English   中英

触发一系列并行任务

[英]firing a sequence of parallel tasks

对于这个 dask 代码:

def inc(x): 
  return x + 1

for x in range(5):
  array[x] = delay(inc)(x)

我想通过执行延迟任务来访问array的所有元素。 但是我不能调用array.compute()因为array不是函数。 如果我做

for x in range(5):
  array[x].compute()

那么每个任务是并行执行还是只有在a[0]终止后才触发a[1] 有没有更好的方法来编写这段代码?

您可以使用dask.compute函数一次计算多个延迟值

from dask import delayed, compute

array = [delayed(inc)(i) for i in range(5)]
result = compute(*array)

如果强迫它们花费很长时间,很容易判断事情是否并行执行。 如果您运行此代码:

from time import sleep, time
from dask import delayed

start = time()

def inc(x):
    sleep(1)
    print('[inc(%s): %s]' % (x, time() - start))
    return x + 1

array = [0] * 5
for x in range(5):
    array[x] = delayed(inc)(x)

for x in range(5):
    array[x].compute()

很明显,调用按顺序发生。 但是,如果你用这个替换最后一个循环:

delayed(array).compute()

然后你可以看到它们是并行的。 在我的机器上,输出如下所示:

[inc(1): 1.00373506546]
[inc(4): 1.00429320335]
[inc(2): 1.00471806526]
[inc(3): 1.00475406647]
[inc(0): 2.00795912743]

很明显,它执行的前四个任务是并行的。 大概默认并行度设置为机器上的内核数,因为对于 CPU 密集型任务,拥有更多内核通常没有用。

暂无
暂无

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

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