我编写了一个类方法,使用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