簡體   English   中英

dask.distributed:等待所有任務在關機前完成(沒有期貨)

[英]dask.distributed: wait for all tasks to finish before shutdown (without futures)

語言:

我正在使用fire_and_forgetdask.distributed集群上執行任務,因此我不會為每個任務維護未來。 在集群關閉之前,我怎樣才能等到它們全部完成?

細節:

我有一個工作流,它創建一個保存在集群上的xarray數據集。 計算完成后,我想單獨保存時間片並轉到下一個數據集。

到目前為止,我一直在使用delayed的 function 並收集了延遲任務的列表,然后將其傳遞給client.compute - 這樣我就可以確定在我轉移到下一個數據集之前一切都已完成。 不利的一面是,在所有最后一個文件都被寫入之前,所有內容都會被阻止。

現在我正在研究fire_and_forget以便能夠在前一個數據集的文件仍在寫入時開始對下一個數據集進行計算。

我計划在開始fire_and_forget任務之前wait每個數據集完成,所以他們應該有足夠的時間來完成。 我遇到的唯一問題是,在處理最后一個數據集時,沒有更多的等待,並且集群在最后一次fire_and_forget調用后關閉,即使進程仍在運行。

那么有什么方法可以告訴客戶端它需要阻塞直到所有完成?

還是我可能沒有正確理解fire_and_forget的使用,應該堅持我以前的方法?

這是一個模擬工作流程的示例代碼 - 它進行 10 次迭代(模擬不同的數據集),然后將前 10 個時間片寫入 pickle 文件。 所以最后我希望磁盤上有 100 個泡菜文件,但事實並非如此。

import pickle
import random
from time import sleep

from dask import delayed
from dask.distributed import LocalCluster, Client, wait, fire_and_forget
import xarray as xr

@delayed
def dump_delayed(x, fn):
    with open(fn, "wb") as f:
        random.seed(42)
        sleep(random.randint(1,2))
        pickle.dump(x, f)

TARGET = "/home/jovyan/"

def main():

    cluster = LocalCluster(n_workers=2, ip="0.0.0.0")
    client = Client(cluster)

    ds = xr.tutorial.open_dataset("rasm")

    for it in range(1,10):
        print("Iteration %s" % it)

        # simulating the processing and persisting
        ds2 = (ds*it).chunk({"time": 1}).persist()
        _ = wait(ds2)
    
        for ii in range(10):
            
            fn = TARGET + f"temp{ii}_{it}.pkl"
            xx = ds2.isel(time=ii)
            
            f = client.persist(dump_delayed(xx, fn))
            fire_and_forget(f)
            

if __name__ == "__main__":
    main()

不確定這是否適合解決方案,但fire_and_forget適用於您不想跟蹤任務狀態的特定用例。 如果您對任務的狀態感興趣,最好使用常規的future

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM