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