[英]Why i got the exception when using 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 !!!
作为类的一部分的函数不称为函数,它们称为方法,并且您不能将对象实例的方法传递给 apply_async(),您需要使用函数。
这样做的原因是multiprocessing
就是在多个进程中做事情,当你传递一个实例方法时,你传递的是一个对象的一部分。 并且该对象仅存在于其中一个进程中,因此其他进程无法访问它。
改变你的
class Worker:
def run(self, msg):
print '%s, it works!' % msg
到
def run(msg):
print '%s, it works!' % msg
并使用它,它应该可以工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.