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
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)
_
with
ステートメントは、__enter__
および__exit__
関数を持つオブジェクト、つまり Context Manager Typesmultiprocessing.Pool
はコンテキストマネージャータイプではありません。以下を試してください:
pool = Pool(processes=2)
pool.map(myFunction, mylist)
pool.map(myfunction2, mylist2)