概要
multiprocessing.Poolで並列化じゃ! と調子に乗ってコードを書いていると表題のようなエラーに遭遇することがあります。
再現するコード。
poolerrortest.py
from multiprocessing import Pool p = Pool(2) def f(x): print(x) p.map(f, [1,2])
# 中略 AttributeError: Can't get attribute 'f' on <module '__main__' from 'poolerrortest.py'>
原因と対策
Poolのインスタンスが作られた時点でプロセスがforkしますが、その時点ではfが定義されていません。よって子プロセスの側でfが見つけられない、というエラーになります。
Poolのインスタンスを作るタイミングを調整することで回避できます。
from multiprocessing import Pool def f(x): print(x) p = Pool(2) p.map(f, [1,2]) """ => 1 2 """
子プロセスの実行に必要なものの定義が終わってからPoolのインスタンスを生成する必要があります。