【问题标题】:multiprocessing map raises exception [duplicate]多处理映射引发异常[重复]
【发布时间】:2013-05-21 15:55:51
【问题描述】:

我有一个使用多处理的简单地图示例。但即使这样我也无法正确运行。

import multiprocessing

p = multiprocessing.Pool()

rere = range(50)
print p.map(lambda x: x+1, rere)

它会打印这个异常:

Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 808, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 761, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 342, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

并且无法使用 Ctrl+C 终止。

我应该如何修复我的示例以使其正常工作?

【问题讨论】:

  • 是的,对不起,我开枪了。它与 multiprocessing.pool.map 的工作方式有关,lambda x: x+1 部分必须是可腌制的,而不是函数,我们都需要更多的实验!
  • stackoverflow.com/questions/8804830/… 看看这个,几乎一模一样
  • 将函数声明为模块中的顶级我得到这个:AttributeError:'module'对象没有属性'f'(当然我的函数被称为f,它声称它不存在出于某种原因)。

标签: python python-2.7 map multiprocessing


【解决方案1】:

好吧,从我对多处理这个奇怪世界的研究来看......

您尝试这样做的方式是不够的。以下是我成功实现的方法。

import multiprocessing as mp
import time

def theGenerator():
    for number in xrange(10):
        yield number

def processNumber(x):
    return x*2

def multiprocessThings():
    pool = mp.Pool()
    gen = theGenerator()
    result = pool.map(processNumber, gen)
    print result

if __name__ == "__main__":
    multiprocessThings()
    time.sleep(10)

将其保存在任何位置,然后双击它。

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

显然这种类型的东西由于某种原因在解释器中不起作用。

【讨论】:

  • 谢谢,这个有效! (我不双击,我使用命令行)。
  • 没问题!我也在这里学习过^_^。它有点像准系统,因此将其修改为您想要的任何东西都不应该做太多工作。
  • 我刚刚发现的另一件事......非常重要的是要确保无论您的功能是什么(在我的示例中为processNumber()),确保它是顶级的!出于某种原因,这非常重要。
猜你喜欢
  • 1970-01-01
  • 2019-12-12
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多