2013-07-15 101 views
0

我創造了這個示例程序來概括這個問題我面臨的存儲過程對象多處理Manager.dict()

import multiprocessing 
from multiprocessing import Manager 

def f (_print): 
    print _print 
    manager = multiprocessing.Manager() 
    dict = manager.dict() 
    dict['process_obj'] = multiprocessing.current_process() 
    print dict 

if __name__ == '__main__': 
    process = multiprocessing.Process(target=f, args= ('hello function',)) 
    process.start() 
    process.join() 

那麼,如何存儲過程對象多處理Manager.dict()?

回答

1

我假設你在談論收到此錯誤:

hello function 
Process Process-1: 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap 
    self.run() 
    File "/usr/local/lib/python2.7/multiprocessing/process.py", line 114, in run 
    self._target(*self._args, **self._kwargs) 
    File "mp2.py", line 8, in f 
    dict['process_obj'] = multiprocessing.current_process() 
    File "<string>", line 2, in __setitem__ 
    File "/usr/local/lib/python2.7/multiprocessing/managers.py", line 758, in _callmethod 
    conn.send((self._id, methodname, args, kwds)) 
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed 

(它通常是一個好主意,包括「我得到了什麼」和「我的預期得到,而不是」的問題)。

這裏的根本問題是,multiprocessing.current_process()返回一個實例方法。實例方法不正確,並且multiprocessing必須保存(pickle)並加載(unpickle)共享數據項以將其值從一個進程傳送到另一個進程。參見例如,Can't pickle <type 'instancemethod'> when using python's multiprocessing Pool.map()Overcoming Python's limitations regarding instance methods。特別要注意第二個答案之一:找出一些發送/共享的狀態可能會更好,而不是整個實例。舉例來說,如果一個進程的ident就足夠了,你可以這樣做:

dict['process_obj'] = multiprocessing.current_process().ident 

工作正常。

+0

非常感謝。身份證做了我的工作 – user1650865