1. ホーム
  2. python

[解決済み] マルチプロセッシングの例でAttributeErrorが発生する。

2023-01-10 01:10:25

質問

私は自分のコードにマルチプロセシングを実装しようとしているので、いくつかの例で学習を始めようと思いました。 私はこの中で見つかった最初の例を使用しました ドキュメント .

from multiprocessing import Pool
def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))

上記のコードを実行すると AttributeError: can't get attribute 'f' on <module '__main__' (built-in)> . 私はなぜこのエラーが発生するのかわかりません。 私はまた、それが助けになるならば、Python 3.5を使用しています。

どのように解決するのですか?

この問題は、multiprocessing.Poolの設計上の特徴と思われます。参照 https://bugs.python.org/issue25053 . 何らかの理由で、Pool はインポートされたモジュールで定義されていないオブジェクトでは常に動作しません。そのため、関数を別のファイルに書き、そのモジュールをインポートする必要があります。

ファイルです。 defs.py

def f(x):
    return x*x

ファイル run.py

from multiprocessing import Pool
import defs

 if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(defs.f, [1, 2, 3]))

printや他の組み込み関数を使えば、この例はうまくいくはずです。もしこれがバグでないなら(リンクによれば)、与えられた例は悪く選ばれています。