【发布时间】:2014-11-01 19:49:21
【问题描述】:
我在一个文件夹中有三个文件:
MultiProcFunctions.py
我们的想法是采用任何函数并将其并行化
import multiprocessing
from multiprocessing import Manager
def MultiProcDecorator(f,*args):
"""
Takes a function f, and formats it so that results are saved to a shared dict
"""
def g(procnum,return_dict,*args):
result = f(*args)
return_dict[procnum] = result
g.__module__ = "__main__"
return g
def MultiProcFunction(f,n_procs,*args):
"""
Takes a function f, and runs it in n_procs with given args
"""
manager = Manager()
return_dict = manager.dict()
jobs = []
for i in range(n_procs):
p = multiprocessing.Process( target = f, args = (i,return_dict) + args )
jobs.append(p)
p.start()
for proc in jobs:
proc.join()
return dict(return_dict)
MultiProcClass.py
定义一个类的文件,该类利用上述函数并行化sq 函数:
from MultiProcFunctions import MultiProcDecorator, MultiProcFunction
def sq(x):
return x**2
g = MultiProcDecorator(sq)
class Square:
def __init__(self):
pass
def f(self,x):
return MultiProcFunction(g,2,x)
MultiProcTest.py
最后,我有第三个文件导入上面的类并尝试调用f 方法:
from MultiProcClass import Square
s = Square()
print s.f(2)
但是,这会产生错误:
File "C:\Python27\lib\multiprocessing\managers.py", line 528, in start
self._address = reader.recv()
EOFError
我在 Windows 7 上,也尝试过:
from MultiProcClass import Square
if __name__ == "__main__":
s = Square()
print s.f(2)
在这种情况下,我得到了一个不同的错误:
PicklingError: Can't pickle <function g at 0x01F62530>: it's not found as __main__.g
不知道如何做出正面或反面。在 Ubuntu 12.04 LTS 上我没有遇到任何错误,所有这些都完美无缺;所以这个错误肯定与 Windows 的处理方式有关,但我不能指望它。任何见解都非常感谢!
【问题讨论】:
标签: python windows class multiprocessing