2014-01-27 13 views
0

我寫了一個很好的並行作業處理器,接受作業(函數,它們的參數,超時信息等),然後提交給Python multiprocessing池。我可以提供完整的(長)代碼,如果提出要求,但關鍵的一步(在我看來)是異步應用程序池:在一個泡菜:如何序列化傳統對象以提交給Python多處理池

job.resultGetter = self.pool.apply_async(
    func = job.workFunction, 
    kwds = job.workFunctionKeywordArguments 
) 

我試圖用這個並行工作的處理器與龐大的身軀遺留代碼,也許自然,卻碰上了pickling問題:

PicklingError: Can’t pickle <type ’instancemethod’>: attribute lookup builtin .instancemethod failed 

這種類型的問題是觀察到,當我嘗試提交問題的對象作爲功函數的參數。真正的問題是這是遺留代碼,我建議我只能對它做很小的修改。所以......是否有一些聰明的技巧或簡單的修改,我可以讓某些地方允許我的並行作業處理器代碼應對這些傳統不可取的對象?我完全控制並行作業處理器代碼,因此我願意將每個提交的函數包裝到另一個函數中。對於遺留代碼,我應該可以將偶爾的小方法添加到對象中,但這就是它。有這種類型的問題有一些聰明的方法嗎?

回答

1
+0

非常感謝你的建議。不幸的是,我受到的限制是'''multiprocessing'''被認爲是「被驗證的」,而我參與其中的是更多的現代更新和類似的並行處理方法。但是,我會試驗。謝謝 – d3pd

+0

好吧,您可以爲多處理分支提供一個案例,因爲它只是一個較舊版本的多處理,其中有一兩百行模塊的序列化嘗試被抽出,並被一行「import dill」取代。 Dill主要是python的pickle,還有一些額外的序列化方法被註冊到pickle註冊表中。然而,這聽起來像不會幫助你讓他們考慮「驗證」 - 「驗證」翻譯爲「標準的Python庫」或類似「EPD/Anaconda」? –