2014-10-29 109 views
0

我正在嘗試使用Pool.starmap_async來運行一些採用多個參數作爲輸入的代碼,以便快速掃描參數空間。代碼運行一個有時不會收斂的linalg函數,而是拋出一個np.linalg.LinAlgError。在這種情況下,我希望我的代碼返回np.nan,並繼續其快樂的方式。理想情況下,我也希望指定一個超時,以便代碼在設定的秒數後放棄並繼續到不同的參數組合。Python 3多處理:內部和超時錯誤處理和回調

# This is actually some long function that sometimes returns a linalg error def run_solver(A, B): return A+B

if __name__ == '__main__':

# Parameters  
Asearch = np.arange(4, 8, 1) 
Bsearch = np.arange(0.2, 2, 0.2) 

# Search all combinations of Qsearch and Rmsearch 
AB = np.array(list(itertools.product(Qsearch, Rmsearch))) 
A = AB[:, 0] 
B = AB[:, 1] 

result = {} 

with Pool(processes=15) as pool: 

    def cb(r): 
     print("callback") 
     result[params] = r 

    def ec(r): 
     result[params] = np.nan 
     print("error callback") 
     raise np.linalg.LinAlgError 

    try: 
     params = (zip(A, B)) 
     r = pool.starmap_async(run_solver, params, callback=cb, error_callback=ec) 
     print(r.get(timeout=10)) 

    except np.linalg.LinAlgError: 
     print("parameters did not converge") 

    except mp.context.TimeoutError: 
     print("Timeout error. Continuing...") 

pickle.dump(result, open("result.p", "wb")) 
print("pickling output:", result)` 

我試圖抓住TimeoutError作爲例外,這樣的代碼將繼續,而我故意提高LinAlgError因爲我試圖挑開當代碼耗盡時間不能及時收斂 - 我意識到這是多餘的。首先,結果字典並沒有最終成爲我的意圖:是否有一種方法可以查詢當前進程的參數並將它們用作字典鍵?另外,如果發生超時錯誤,我會以某種方式標記這些參數 - 最好的方法是什麼?

最後,爲什麼在這段代碼中回調只調用一次?不應該因爲每個流程都成功完成而被調用?代碼返回一個字典,其中所有參數都塞進一個鍵(作爲.zip文件),所有答案都是鍵值中的一個列表。

回答

0

我不認爲我完全理解這裏的問題,但是如果你簡化它到這樣的東西,你在計算函數中捕獲LinAlgError

這裏apply_async用於獲取發送到池的每個任務的結果對象。這使您可以輕鬆地對結果對象應用超時。

def run_solver(A, B): 
    try: 
     result = A + B 
    except np.linalg.LinAlgError: 
     result = np.nan 
    return result 

results = [] 
with Pool(processes=15) as pool: 
    params = (zip(A, B)) 
    result_pool = [pool.apply_async(run_solver, args) for args in params] 
    for result in result_pool: 
     try: 
      results.append(result.get(15)) 
     except context.TimeoutError: 
      # do desired action on timeout 
      results.append(None) 
+0

我喜歡這個主意,但是這段代碼不起作用 - 地圖對象不可迭代。你的逐字代碼返回結果爲pool.starmap_async(run_solver,params): TypeError:'MapResult'對象不可迭代 – 2014-10-29 16:05:07

+0

我用另一種方法更新了它,以實現類似於我的想法。 – monkut 2014-10-30 01:17:44