在达斯克完成任务而不是未完成任务时如何获得结果?

时间:2019-04-05 14:13:08

标签: dask dask-distributed

我有一个模糊的数据框,想计算一些独立的任务。有些任务比其他任务快,但是在完成更长的任务后,我会得到每个任务的结果。

我创建了一个本地客户端,并使用client.compute()发送任务。然后,我使用future.result()来获取每个任务的结果。

我正在使用线程同时询问结果,并测量每个结果的计算时间,如下所示:

def get_result(future,i):
    t0 = time.time()
    print("calculating result", i)
    result = future.result()
    print("result {} took {}".format(i, time.time() - t0))

client = Client()
df = dd.read_csv(path_to_csv)

future1 = client.compute(df[df.x > 200])
future2 = client.compute(df[df.x > 500])

threading.Thread(target=get_result, args=[future1,1]).start()
threading.Thread(target=get_result, args=[future2,2]).start()

我希望以上代码的输出类似于:

calculating result 1
calculating result 2
result 2 took 10
result 1 took 46

因为第一个任务更大。

但是我却同时得到了

calculating result 1
calculating result 2
result 2 took 46.3046760559082
result 1 took 46.477620363235474

我认为这是因为 future2 实际上是在后台进行计算,并在 future1 之前完成,但是要等到 future1 完成返回。

有没有一种方法可以在future2完成时获取其结果?

1 个答案:

答案 0 :(得分:1)

您不需要使线程以异步方式使用期货-它们已经天生就异步了,并在后台监视它们的状态。如果要按准备好的顺序获得结果,则应使用as_completed

但是,对于您的特定情况,您可能只想查看仪表板(或使用df.visulalize())来了解正在发生的计算。两种期货都依赖于读取CSV,并且必须先完成一项任务-否则可能会花费绝大多数时间。在不扫描所有数据的情况下,Dask并不知道哪些行的值为x