2017-03-07 85 views
0

與ipyparallel最佳實踐相關的一些問題。我試圖用它來實現一個需要運行~15的模型的蒙特卡羅框架。這個想法是運行N個引擎(通過SLURM)並擁有一個「主」進程,它將所有需要的任務異步排隊並忙碌 - 等待完成,更新一個包含每次運行狀態的sqlite數據庫。通過ipython並行啓動新任務時的通知

我想知道一個任務何時被分配給一個引擎,以便我可以跟蹤其數據庫中的狀態。我嘗試使用AsyncResult實例來獲取msg_id並查詢任務數據庫,但直到任務完成後纔會更新「已啓動」字段。

似乎應該有一種方法來接收此通知,或者至少在引擎工作時查詢集線器。

此外,我必須做些什麼來避免長時間運行任務期間發動機心跳超時?這是client.spin_thread()的目的嗎?

謝謝!

回答

0

我已經使用publish_data回答了我自己問題的一部分。我的想法是,不是在每個引擎中調用我的主「worker」函數,而是在主worker函數前後調用publish_data()來設置客戶端可以看到的狀態。例如:

def wrapper(run_id, argDict): 
    from ipyparallel.engine.datapub import publish_data 

    publish_data({run_id : 'running'}) 
    status = runMonteCarloTrial(argDict) # runs for ~15 minutes 
    publish_data({run_id : status}) 
    return status 

「主」任務調用:

ar = client.map_async(wrapper, listOfArgDicts) 

我然後遍歷ar直到所有AsyncResults是否齊全,檢查ar.data讀取公佈的數據,以確定運行試驗和保存試驗結果到一個sqlite3數據庫。

這種通用方法適用於簡單的測試用例。我還沒有探討長時間運行函數調用的超時問題。

相關問題