2

理由はわかりませんが、昨日、私が書いたマルチプロセッシング コードをテストしていて、問題なく動作していました。その後、今日コードをもう一度確認したところ、次のエラーが表示されました。

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

コードの構造は次のとおりです。
* A.py と B.py という 2 つのモジュールがあります。
* A.py には、A という名前のクラスが定義されています。
* B.py には、同様にクラス B があります。
* クラス AI には、属性の 1 つとしてマルチプロセッシング プールがあります。
* プールは で定義されていますがA.__init__()、別のメソッドで使用されています - run()
* ではA.run()、クラス B のいくつかのオブジェクト (objBList と呼ばれるリストに収集されます) のいくつかの属性を設定し、次に使用しますpool.map(processB, objBList)
* processB() はモジュールです関数 (A.py 内) が唯一のパラメーター (B のインスタンス) として受け取り、呼び出します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()

ところで、マルチプロセッシングが Windows で動作する方法のため、processB() モジュール関数を使用せざるを得ません。

また、子プロセスにプールオブジェクトを送信しようとしていないため、取得しているエラー-プールをピクルすることはできません-は、コードのどの部分も参照してはならないことを指摘したいと思います。

何か案は?

(追伸: この機能をテストしていた 2 日間の間に、コンピューターが予期せず再起動したことにも言及する必要があります。おそらく、Windows の更新プログラムをインストールした後でした。)

4

1 に答える 1

0

クラス B オブジェクトに A インスタンスへの参照が含まれている可能性があります。

于 2012-09-07T09:11:57.843 に答える