2016-11-22 41 views
0

在方法上使用multiprocessing時,出現錯誤,說明self.methods cannot be pickled使用self.methods進行多處理

爲了克服這個問題我用:

def _pickle_method(m): 
    if m.im_self is None: 
     return getattr, (m.im_class, m.im_func.func_name) 
    else: 
     return getattr, (m.im_self, m.im_func.func_name) 


copy_reg.pickle(types.MethodType, _pickle_method) 

現在我搜索了這一點,但幾個問題仍不清楚:

  1. 爲什麼不能self.methods醃製?
  2. copy_reg.pickle()如何工作?它如何使酸洗self.methods
  3. 使用此方法是否有任何不利之處,或者是否有其他更好的方法?

更多信息:

我有一個類中的功能,用來做request.getrequest.post。爲了改善時間,我使用了多處理。 這是我遇到的確切問題。

SO Question

+0

沒有更多的信息,這是很難理解_why_' pickle'會嘗試序列化一個實際的類方法(這不是'pickl' e'做事情) - 所以有可能的答案是「如果你需要這樣做,你就會做其他事情。」請[編輯]您的問題並添加更多上下文。 – martineau

+0

「self.methods」究竟是什麼?如果可能的話,請用'request.get'和'request.post'(以及相關的多處理)的方法顯示類。 – martineau

+0

@martineau我只是使用self.mathods這個名字....他們只是任何類的方法,它採取自我......代碼可以在鏈接的SO帖子中找到......其相同或相似 – vks

回答

2

你的使用目的仍然是一個有點含糊,所以我反而會呈現的方式來解決linked question你的問題的新的「更多信息」一節不需要酸洗的字節級的類方法的代碼。我認爲它是如何做的是相當明顯的...

someclass.py

import multiprocessing 

def call_method(x): 
    return SomeClass().f(x) 

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(call_method, range(10)) 

test.py

import someclass 

if __name__== '__main__' : 
    sc = someclass.SomeClass() 
    sc.go() 

輸出:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 
+0

' pickle'不會序列化代碼。它存儲關於任何需要保存的足夠信息,以便在需要時導入它。 'copy_reg()'函數在[在線文檔](https://docs.python.org/2/library/copy_reg.html)中有描述。這是將函數與特定數據類型關聯(註冊)的一種方法。當嘗試序列化遇到的指定類型的任何對象時,將調用此函數。 – martineau

+0

ohh好....清理的東西...只有一個問題仍然....爲什麼不能多處理pickle self.methods,而它可以在使用正常的功能時。有問題的SO鏈接確實解釋,但你能拋出更多的光對此,M仍然不確定。 – vks

+0

@vks:我不確定你的意思是「正常功能」。無需醃製內置函數,因爲它們始終可用。 – martineau