在Windows上使用IPython Notebook的类中使用multiprocessing.Pool

时间:2015-06-21 13:28:01

标签: python windows multiprocessing ipython ipython-notebook

我编写了一个类方法,使用multiprocessing.Pool生成第二个类的多个实例(见下文)。使用IPython,这适用于Linux / OSX,但不适用于Windows(它会挂起)。所以我的问题;是否有可能,以及最简洁的方式,改变我的代码,以便在Windows上运行? (编辑:它似乎是IPython Notebook特有的问题)

我已经阅读了很多关于Windows缺少fork()if __name__ == "__main__":的问题的帖子,但是如果我使用的是IPython Notebook,我还不清楚如何在这个实例中实现它。

先谢谢你,克里斯。

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

然后在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}])

这将在Linux / OSx中运行,但会在Windows中挂起并出现错误:

AssertionError: __main__
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  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

0 个答案:

没有答案