web-dev-qa-db-ja.com

Python Multiprocessing Lib Error(AttributeError:__exit__)

pool.map(funct, iterable)を使用するとこのエラーが発生します:

AttributeError: __exit__

説明なし。モジュール内のpool.pyファイルへのスタックトレースのみ。

この方法で使用する:

with Pool(processes=2) as pool:
   pool.map(myFunction, mylist)
   pool.map(myfunction2, mylist2)

ピクル可能性に問題がある可能性があると思います(Pythonはpickleが必要、またはリストデータをバイトストリームに変換する必要があります).

編集:このエラーを生成するコードの新しい形式:

def governingFunct(list):
    #some tasks
    def myFunction():
         # function contents
    with closing(Pool(processes=2)) as pool:
         pool.map(myFunction, sublist)
         pool.map(myFunction2, sublist2)

生成されたエラー:

PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
30
sidewaiise

Python 2.xおよび3.0、3.1および3.2、multiprocessing.Pool()オブジェクトはではないコンテキストマネージャーですwithステートメントでは使用できません。Python 3.3以降でのみ使用できます。 Python 3 multiprocessing.Pool()ドキュメント

バージョン3.3の新機能:プールオブジェクトがコンテキスト管理プロトコルをサポートするようになりました-コンテキストマネージャータイプをご覧ください。 __enter__()はプールオブジェクトを返し、__exit__()はterminate()を呼び出します。

以前のPythonバージョンでは、 contextlib.closing() を使用できましたが、これを呼び出すことを考慮してくださいpool.close()pool.terminate()ではなく、その場合は手動で終了します。

_from contextlib import closing

with closing(Pool(processes=2)) as pool:
    pool.map(myFunction, mylist)
    pool.map(myfunction2, mylist2)
    pool.terminate()
_

または、独自のterminating()コンテキストマネージャーを作成します。

_from contextlib import contextmanager

@contextmanager
def terminating(thing):
    try:
        yield thing
    finally:
        thing.terminate()

with terminating(Pool(processes=2)) as pool:
    pool.map(myFunction, mylist)
    pool.map(myfunction2, mylist2)
_
51
Martijn Pieters

withステートメントは、__enter__および__exit__関数を持つオブジェクト、つまり Context Manager Types
multiprocessing.Poolはコンテキストマネージャータイプではありません。以下を試してください:

pool = Pool(processes=2)
pool.map(myFunction, mylist)
pool.map(myfunction2, mylist2)
1
Elisha