【发布时间】:2014-06-27 13:45:07
【问题描述】:
我有一个实例化对象的 sconstruct 脚本。这个对象在内部调用一个方法而不是运行多处理模块。下图示例
这个对象在调用函数之前解压文件并将输入传递给多处理模块。
def run_scons(self,inpfile,outfile):
# Unpickle input parameter
fid=open(inpfile,'rb')
input_data=pkls.load(fid)
my_results=[]
#run solver in loop
for my_data in input_data:
work_ers=len(my_data)
pool = Pool(processes=work_ers)
a_result=pool.map_async(my_solver, my_data)
pool.close()
pool.join()
my_results.append(a_result.get())
fid.close()
fid_out=open(outfile,'wb+')
pkls.dump(rot_full_results,fid_out)
通过 scons 执行相同功能时出现以下错误。
pool = Pool(processes=work_ers)
File "C:\Python27\lib\multiprocessing\__init__.py", line 232, in Pool
return Pool(processes, initializer, initargs, maxtasksperchild)
File "C:\Python27\lib\multiprocessing\pool.py", line 138, in __init__
self._setup_queues()
File "C:\Python27\lib\multiprocessing\pool.py", line 232, in _setup_queues
from .queues import SimpleQueue
File "C:\Python27\lib\multiprocessing\queues.py", line 48, in <module>
from multiprocessing.synchronize import Lock, BoundedSemaphore, Semaphore, Condition
File "C:\Python27\lib\multiprocessing\synchronize.py", line 48, in <module>
from multiprocessing.forking import assert_spawning, Popen
File "C:\Python27\lib\multiprocessing\forking.py", line 60, in <module>
class ForkingPickler(Pickler):
File "C:\Python27\lib\multiprocessing\forking.py", line 61, in ForkingPickler
dispatch = Pickler.dispatch.copy()
AttributeError: 'builtin_function_or_method' object has no attribute 'dispatch'
scons: building terminated because of errors.
阅读有关此错误的信息后,我发现 SCONS 有一个技巧,它将 pickle 模块重命名为 cPickle,而多处理模块正在寻找 cPickle 并且一切都失败了。有没有办法解决?
【问题讨论】:
-
我发现了一个更新。对于 scipy 构建,他们有同样的问题。 (comments.gmane.org/gmane.comp.programming.tools.scons.user/…) 我不确定如何在 sconstruct 文件中设置这个变量“SCONS_HORRIBLE_REGRESSION_TEST_HACK”。
标签: python-2.7 multiprocessing scons