web-dev-qa-db-ja.com

jupyterノートブックのmultiprocessing.Poolは、Linuxでは動作しますが、Windowsでは動作しません

私はいくつかの独立した計算を実行しようとしています(ただし、同じデータから読み取ります)。私のコードはUbuntuで実行すると動作しますが、エラーが発生するWindows(Windows Server 2012 R2)では動作しません:

'module' object has no attribute ...

multiprocessing.Pool(ノートブック自体の出力としてではなく、カーネルコンソールに表示されます)を使用しようとすると

(そして、プールを作成した後に関数を定義するという間違いを既に犯しており、それを修正しましたが、それは問題ではありません)。

これは、最も単純な例でも起こります。

from multiprocessing import Pool
def f(x):
    return x**2
pool = Pool(4)
for res in pool.map(f,range(20)):
    print res

モジュールをインポートする必要があることを知っています(ノートブックで作業するときにこれがどのように機能するかわかりません)IPython.Parallelを聞いたことがありますが、ドキュメントや例。

どんな解決策/代替案も大歓迎です。

16
user1999728

完全な回答が得られていないので、これをコメントとして投稿しますが、何が起こっているのかを把握しながら修正します。

from multiprocessing import Pool

def f(x):
    return x**2

if __name__ == '__main__':
    pool = Pool(4)
    for res in pool.map(f,range(20)):
        print(res)

これは動作します。この質問に対する答えは here だと思います。つまり、サブプロセスはサブプロセスであることを認識せず、メインスクリプトを再帰的に実行しようとしています。

これは私が与えられたエラーであり、同じ解決策を提供します:

RuntimeError: 
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.
2
GRAYgoose124