Подтвердить что ты не робот

Multiprocessing.Pool в ноутбуке jupyter работает на Linux, но не на окнах

Я пытаюсь запустить несколько независимых вычислений (хотя чтение из одних и тех же данных). Мой код работает, когда я запускаю его на 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, но мне не удалось найти какую-либо документацию или примеры.

Любые решения/альтернативы были бы наиболее желанными.

4b9b3361

Ответ 1

Я бы опубликовал это как комментарий, так как у меня нет полного ответа, но я исправлю, когда выясню, что происходит.

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)

Это работает. Я считаю, что ответ на этот вопрос здесь. Короче говоря, подпроцессы не знают, что они являются подпроцессами и пытаются рекурсивно запустить основной script.

Это ошибка, которую я даю, что дает нам одно и то же решение:

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.