2014-04-01 49 views
1

我使用多執行一串連續的任務。這些任務每次在位於不同文件夾中的不同文件上都是相同的。每個任務都由對其他幾個模塊和C++程序的調用組成。有一個高層包裝管理對其他模塊/功能的調用。在多處理代碼的執行開始時,創建一個帶有id和該高級別類的實例的列表。然後一個進程池執行這些任務。Pool.map引發IndexError

它當晦澀引發異常運行正常,直到一個觀點:

Traceback (most recent call last): 
    File "test_parallel.py", line 197, in <module> 
    pool_outputs = pool.map(do_calculations, zip(list_instances, list_IDs),) 
    File "/usr/lib64/python2.6/multiprocessing/pool.py", line 148, in map 
    return self.map_async(func, iterable, chunksize).get() 
    File "/usr/lib64/python2.6/multiprocessing/pool.py", line 422, in get 
    raise self._value 
IndexError: tuple index out of range 

這是當任務已經進行了很多次(〜100任務的200計劃),通常提高。

代碼的一個縮短的版本是:

import multiprocessing 
if __name__=="__main__": 
    which_subfields=range(200) 
    pool_size = int(multiprocessing.cpu_count()) 

    run = WrapperAroundModule.run(version = "parallel") 

    if pool_size == 0: 
     pool_size=1 

    list_IDs = list(which_subfields) 
    lock=multiprocessing.Lock() 
    runs = [] 

    for _ in which_subfields: 
     runs.append(copy.deepcopy(run)) 

    pool = multiprocessing.Pool(processes=pool_size,) 

    pool_outputs = pool.map(do_calculations, zip(list_instances, list_IDs),) 

    pool.close() 
    pool.join() 

do_calculations功能存在的簽名:do_calculations((instance, id))

我確信功能do_calculations是線程安全的,但事實並非如此改變這種狀況的話,我想用maxtasksperchild,但不幸的是,我必須使用Python 2.6和模塊Billard不能在服務器(運行Linux的科學),我使用的是安裝。因此,我寫了一個解決方法:要執行的任務除以長度爲pool_size*maxtasksperchild的塊。腳本使用類似的代碼在池上執行這些任務。一旦完成,該池及其周圍的所有變量都將被刪除,並在下一個任務中創建一個新池。可悲的是,這個錯誤在某些時候仍然存在。此外,我確信這兩個名單作爲論證足夠長。功能do_calculations可以在多處理版本中失敗的單個任務上平穩運行。

這種錯誤的來源和可能的修正上的任何想法?

回答

2

raise self._value意味着do_calculations在子進程中引發了異常,multiprocessing在主進程中爲您進行了重新評估。

爲了擺脫異常,修復do_calculations()功能。用try/except包裝它並打印完整的回溯/當地人以瞭解錯誤在哪裏。

+0

好,謝謝,我開始隔離錯誤,即使它是不平凡的。 – Jolfulorc