web-dev-qa-db-fra.com

multiprocessing.Pool dans jupyter notebook fonctionne sur linux mais pas sur windows

J'essaie d'exécuter quelques calculs indépendants (bien que la lecture des mêmes données). Mon code fonctionne lorsque je l'exécute sur Ubuntu, mais pas sur Windows (Windows Server 2012 R2), où j'obtiens l'erreur:

'module' object has no attribute ...

quand j'essaie d'utiliser multiprocessing.Pool (il apparaît dans la console du noyau, pas comme sortie dans le portable lui-même)

(Et j'ai déjà fait l'erreur de définir la fonction APRÈS avoir créé le pool, et je l'ai aussi corrigé, ce n'est pas le problème).

Cela se produit même sur les exemples les plus simples:

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

Je sais qu'il doit pouvoir importer le module (et je n'ai aucune idée de comment cela fonctionne lorsque vous travaillez dans le cahier), et j'ai entendu parler de IPython.Parallel, mais je n'ai pas pu trouver de documentation ou d'exemples.

Toutes les solutions/alternatives seraient les bienvenues.

16
user1999728

Je posterais ceci en tant que commentaire car je n'ai pas de réponse complète, mais je modifierai en fonction de ce qui se passe.

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)

Cela marche. Je crois que la réponse à cette question est ici . En bref, les sous-processus ne savent pas qu'ils sont des sous-processus et tentent d'exécuter le script principal de manière récursive.

C'est l'erreur que l'on me donne, qui nous donne la même solution:

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