我正在尝试并行化我的任务,并决定使用多处理(mp)模块。我很快就了解到mp不能处理嵌套函数,所以我不得不解套一个类似如下的函数:
def foo(nomer1, nomer2):
def bar(nomer1, nomer2):
return ([nomer1] * nomer2)
return(bar(nomer1, nomer2))要这样做:
def bar(nomer1, nomer2):
return([nomer1]*nomer2)
def foo(nomer1, nomer2):
return(bar(nomer1, nomer2))但是,当我运行以下命令时:
import multiprocessing as mp
n_proc = 2
pool = mp.Pool(processes=n_proc)
pool.starmap(foo, [11, 2])控制台会产生以下错误:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "C:\Users\user\Anaconda2\envs\env1\lib\multiprocessing\pool.py", line 274, in starmap
return self._map_async(func, iterable, starmapstar, chunksize).get()
File "C:\Users\user\Anaconda2\envs\env1\lib\multiprocessing\pool.py", line 644, in get
raise self._value
File "C:\Users\user\Anaconda2\envs\env1\lib\multiprocessing\pool.py", line 424, in _handle_tasks
put(task)
File "C:\Users\user\Anaconda2\envs\env1\lib\multiprocessing\connection.py", line 206, in send
self._send_bytes(_ForkingPickler.dumps(obj))
File "C:\Users\user\Anaconda2\envs\env1\lib\multiprocessing\reduction.py", line 51, in dumps
cls(buf, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function foo at 0x00000189D37902F0>: attribute lookup foo on __main__ failed正如documentation中所指定的,Foo位于最顶层,但mp仍然无法对其进行筛选。我如何解决这个问题,最好不安装额外的软件包?
发布于 2018-08-24 21:32:19
我已经用concurrent.futures解决了这个问题
这个包应该与我的Python安装一起使用,并且这个问题可以像下面这样简单地解决:
pool = ThreadPoolExecutor(2)
future = pool.submit(foo, 11,2)
print(future.result()) 该错误似乎是a known bug的结果。不过,建议的Anaconda更新并没有帮助。我想知道这个bug在被报告了一年后是否仍然存在。
同时,future的ProcessPoolExecutor也产生了类似的错误:
Traceback (most recent call last):
File "C:\Users\user\Anaconda2\envs\env1\lib\multiprocessing\queues.py", line 234, in _feed
obj = _ForkingPickler.dumps(obj)
File "C:\Users\user\Anaconda2\envs\env1\lib\multiprocessing\reduction.py", line 51, in dumps
cls(buf, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function foo at 0x000001D816CF5510>: attribute lookup foo on __main__ failedhttps://stackoverflow.com/questions/52004887
复制相似问题