2012-12-01 60 views
2

这里是我的代码:为什么我在使用multiprocessing.Pool时遇到异常?

import multiprocessing 

class Worker: 
    def run(self, msg): 
     print '%s, it works!' % msg 

def start_process(): 
    print 'Starting',multiprocessing.current_process().name 

if __name__=='__main__': 
    pool = multiprocessing.Pool(processes=2, initializer=start_process,) 
    pool.apply_async(Worker().run, args=('congbo',)) 
    pool.close() 
    pool.join() 

但我在控制台有一个例外:

Starting PoolWorker-1 
Starting PoolWorker-2 
Exception in thread Thread-2: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.7/threading.py", line 504, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "/usr/lib/python2.7/multiprocessing/pool.py", line 319, in _handle_tasks 
    put(task) 
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed 

我刚过一个class.func到pool.apply_async(),但我得到的例外。 有人可以告诉我如何将class.func传递给pool.apply_async(),3x!

回答

3

作为类的一部分的函数不称为函数,它们被称为方法,并且您不能将对象实例的方法传递给apply_async(),您需要使用函数。

原因是multiprocessing是关于在多个进程中执行的事情,当您传递实例方法时,会传递属于对象一部分的内容。并且该对象仅存在于其中一个进程中,所以其他进程无法访问它。

更改

class Worker: 
    def run(self, msg): 
     print '%s, it works!' % msg 

def run(msg): 
    print '%s, it works!' % msg 

并使用,它应该工作。

+0

谢谢,我已经知道我的程序发生了什么。 –

+0

@ lennart-regebro。我知道这已经过去了几年,但我遇到了同样的问题。不情愿地,我所做的是创建了一个与类方法交互的函数。例如,我做了'def run(msg): –

相关问题