2012-09-07 46 views
1

我不知道爲什麼,但昨天我測試了一些我編寫的多處理代碼,它工作正常。那麼今天,當我再次檢查代碼,它會給我這個錯誤:Python 3.2多處理NotImplementedError:池對象不能是

Exception in thread Thread-5: 
Traceback (most recent call last): 
    File "C:\Python32\lib hreading.py", line 740, in _bootstrap_inner 
    self.run() 
    File "C:\Python32\lib hreading.py", line 693, in run 
    self._target(*self._args, **self._kwargs) 
    File "C:\Python32\lib\multiprocessing\pool.py", line 342, in _handle_tasks 
    put(task) 
    File "C:\Python32\lib\multiprocessing\pool.py", line 439, in __reduce__ 
    'pool objects cannot be passed between processes or pickled' 
NotImplementedError: pool objects cannot be passed between processes or pickled 

我的代碼的結構去如下:
*我有2個模塊,說A.py和B.py.
* A.py在其中定義了類A.
* B.py類似地具有類B.
*在類A中,我有一個多處理池作爲屬性之一。
*池處於A.__init__()定義的,但在另一種方法中使用 - 運行()
*在A.run()我設置B類的一些對象(其被收集在一個稱爲objBList列表)的一些屬性,然後我使用pool.map(processB, objBList) * processB()是作爲唯一參數(B的一個實例)接收的模塊函數(以A.py表示),並且調用B.runInput()
*錯誤發生在pool.map()行。

基本上A.py:

class A: 
    def __init__(self): 
     self.pool = multiprocessing.Pool(7) 
    def run(self): 
     for b in objBList: 
     b.inputs = something 
     result = self.pool.map(processB, objBList) 
     return list(result) 
def processB(objB): 
    objB.runInputs() 

和B.py:

class B: 
    def runInputs(self): 
     do_something() 

順便說一句,我被迫使用的,因爲多處理方式的進程B()模塊功能在Windows上運行

此外,我想指出的是,我得到的錯誤 - 這池不能醃製 - 不應該指的是我的代碼的任何部分,因爲我不想送孩子處理任何池對象。

任何想法?

(PS:我還要提到的是,在這兩天,我正在測試此功能的計算機重新啓動意外之間 - 在安裝Windows更新後可能)

+1

請發佈一個演示問題的可運行示例。 –

回答

0

也許你的B類對象包含了你的A參考實例。

+0

其實是!這正是發生的事情。我已經將A的實例傳遞給B的__init__,並將兩者連接起來。我想最好不要在__init __...期間初始化池。 – Gabriel