Utiliser multiprocessing.Pool dans une classe sous Windows avec IPython Notebook

J’ai écrit une méthode de classe pour produire plusieurs instances d’une deuxième classe en utilisant multiprocessing.Pool (voir ci-dessous). En utilisant IPython, cela fonctionne sous Linux / OSX mais pas sous Windows (il va se bloquer). Donc ma question est-il possible, et quelle est la manière la plus succincte, de modifier mon code pour que cela fonctionne sur Windows? (Edit: cela semble être un problème spécifique à IPython Notebook)

J’ai lu de nombreux articles sur les problèmes avec Windows sans fork() et la nécessité de if __name__ == "__main__": mais je ne vois pas comment l’implémenter dans cette instance, si j’utilise IPython Notebook.

Merci d’avance, Chris.

my_class_factory.py

 import multiprocessing class MyClass(object): def __init__(self, a=1): self.a = a def unpack_and_make_class(val_dict): if val_dict.has_key('args'): args = val_dict.pop('args') else: args = [] return MyClass(*args, **val_dict) class MyClassFactory(object): def make_classes(self, inputs): pool = multiprocessing.Pool(processes=multiprocessing.cpu_count()) mapping = pool.map myclasses = mapping(unpack_and_make_class, inputs) pool.close() pool.join() return myclasses 

puis dans IPython Notebook:

 In [1]: from my_class_factory import MyClassFactory In [2]: mcf = MyClassFactory() In []: cls = mcf.make_classes([{'a':1}, {'a':2}, {'a':3}]) 

ceci fonctionnera sous Linux / OSx mais se bloquera dans Windows avec l’erreur:

 AssertionError: __main__ Traceback (most recent call last): File "", line 1, in  File "C:\Users\chris\Anaconda\lib\multiprocessing\forking.py", line 380, in main prepare(preparation_data) File "C:\Users\chris\Anaconda\lib\multiprocessing\forking.py", line 488, in prepare assert main_name not in sys.modules, main_name