2013-05-21 78 views
2

我有这个使用多处理映射的简单例子。但即使如此,我也无法正确运行。多处理映射引发异常

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终止。

我应该如何解决我的例子,使其工作?

+0

是啊,我跳枪对不起。它与multiprocessing.pool.map的工作方式有关,“lambda x:x + 1”部分必须是pickleable,而不是函数,我们都需要更多的实验! – TehTris

+2

http://stackoverflow.com/questions/8804830/python-multiprocessing-pickling-error?rq=1检查一下,它几乎完全相同 – TehTris

+0

声明函数为模块中的顶层我得到这个: AttributeError: 'module'对象没有属性'f'(当然我的函数被称为f,并声称它不存在是由于某种原因)。 – LtWorf

回答

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] 

显然这种类型的东西不会在解释器中出于某种原因。

+0

谢谢,这个作品! (并且我不会双击,我使用命令行)。 – LtWorf

+0

没问题!我也在这里学习^ _ ^。它的种种准备工作 - 可以将它修改为任何你想要的,不应该做太多的工作。 – TehTris

+0

我刚刚发现的另一件事....非常重要的是要确保无论你的函数是什么(在我的例子中它的'processNumber()')确保它是TOP级别!出于某种原因,这非常重要。 – TehTris