在多重處理中,Pool.map() 函數在進程之間分割任務以並發執行。但是,在使用綁定方法時,您可能會遇到錯誤,如給定程式碼所示:
import multiprocessing def f(x): return x*x def go(): pool = multiprocessing.Pool(processes=4) print pool.map(f, range(10)) if __name__== '__main__' : go()
此程式碼可以無縫運行。但是,使用更物件導向的方法可能會失敗並出現錯誤:
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
import someClass if __name__== '__main__' : sc = someClass.someClass() sc.go() class someClass(object): def __init__(self): pass def f(self, x): return x*x def go(self): pool = multiprocessing.Pool(processes=4) print pool.map(self.f, range(10))
解:
問題源自於多處理的要求pickle物件以在進程之間分發它們。然而,綁定方法本質上並不是可醃製的。解決方案包括創建必要的基礎設施來啟用酸洗。 一種方法是使用 copy_reg 標準函式庫方法來註冊酸洗和取消酸洗函數。例如,Steven Bethard 對相關討論主題的貢獻提供了一種使用 copy_reg 進行方法 pickling 和 unpickling 的可行方法。以上是為什麼多重處理會失敗並顯示'Can't Pickle InstanceMethod”以及如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!