首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多处理无法对顶级函数进行pickle

多处理无法对顶级函数进行pickle
EN

Stack Overflow用户
提问于 2018-08-24 20:49:51
回答 1查看 453关注 0票数 1

我正在尝试并行化我的任务,并决定使用多处理(mp)模块。我很快就了解到mp不能处理嵌套函数,所以我不得不解套一个类似如下的函数:

代码语言:javascript
复制
def foo(nomer1, nomer2):

    def bar(nomer1, nomer2):
        return ([nomer1] * nomer2)

    return(bar(nomer1, nomer2))

要这样做:

代码语言:javascript
复制
def bar(nomer1, nomer2):
    return([nomer1]*nomer2)

def foo(nomer1, nomer2):
    return(bar(nomer1, nomer2))

但是,当我运行以下命令时:

代码语言:javascript
复制
import multiprocessing as mp
n_proc = 2
pool = mp.Pool(processes=n_proc)
pool.starmap(foo, [11, 2])

控制台会产生以下错误:

代码语言:javascript
复制
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仍然无法对其进行筛选。我如何解决这个问题,最好不安装额外的软件包?

EN

回答 1

Stack Overflow用户

发布于 2018-08-24 21:32:19

我已经用concurrent.futures解决了这个问题

这个包应该与我的Python安装一起使用,并且这个问题可以像下面这样简单地解决:

代码语言:javascript
复制
pool = ThreadPoolExecutor(2)
future = pool.submit(foo, 11,2)
print(future.result()) 

该错误似乎是a known bug的结果。不过,建议的Anaconda更新并没有帮助。我想知道这个bug在被报告了一年后是否仍然存在。

同时,future的ProcessPoolExecutor也产生了类似的错误:

代码语言:javascript
复制
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__ failed
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52004887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档