我使用多執行一串連續的任務。這些任務每次在位於不同文件夾中的不同文件上都是相同的。每個任務都由對其他幾個模塊和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
可以在多處理版本中失敗的單個任務上平穩運行。
這種錯誤的來源和可能的修正上的任何想法?
好,謝謝,我開始隔離錯誤,即使它是不平凡的。 – Jolfulorc