静かなる名辞

pythonとプログラミングのこと

2019/03/22:TechAcademyがteratailの質問・回答を盗用していた件
2019/03/26:TechAcademy盗用事件 公式発表と深まる疑念



multiprocessing.PoolでAttributeError: Can't get attribute '***' on <module '__main__' from '***.py'>みたいなエラー

概要

 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のインスタンスを生成する必要があります。