【问题标题】:Multiprocessing fails to pickle top level functions多处理无法腌制顶级功能
【发布时间】:2018-08-24 12:49:51
【问题描述】:

我正在尝试并行化我的任务并决定使用多处理 (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

Foo 位于最顶层,如 documentation 中所指定,但 mp 仍然无法腌制它。 我该如何解决这个问题,最好不安装额外的软件包?

【问题讨论】:

标签: python parallel-processing multiprocessing pickle


【解决方案1】:

我已经解决了这个问题,使用concurrent.futures
这个包应该与我的 Python 安装一起使用,问题很容易解决:

pool = ThreadPoolExecutor(2)
future = pool.submit(foo, 11,2)
print(future.result()) 

错误似乎是a known bug 的结果。不过,建议的 Anaconda 更新无济于事。我想知道这个错误在被报告一年后是否仍然存在。

同时,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__ failed

【讨论】:

    猜你喜欢
    • 2015-11-07
    • 1970-01-01
    • 2016-01-05
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多