Python 2.7
中使用下面代码的时候
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import multiprocessing class examplePool: def __init__(self): self.pool = multiprocessing.Pool() def run(self,args): print args def runProcessPool(self): self.pool.apply(self.run,(60,)) self.pool.close() self.pool.join() if __name__ == '__main__': pool = examplePool() pool.runProcessPool() |
会报告如下错误:
1 2 3 4 5 6 7 8 9 10 |
Traceback (most recent call last): File "text.py", line 18, in <module> pool.runProcessPool() File "text.py", line 12, in runProcessPool self.pool.apply(self.run,(60,)) File "/usr/lib/python2.7/multiprocessing/pool.py", line 244, in apply return self.apply_async(func, args, kwds).get() File "/usr/lib/python2.7/multiprocessing/pool.py", line 567, in get raise self._value cPickle.PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed |
这种错误发生的原因是Python 2.7
版本中的multiprocessing
模块的进程池部分存在BUG
,无法正常处理这种写法的代码,据说在Python 3.4
版本之后解决了此问题。
目前测试来看,不用Python 2.7
中的进程池,而是自己创建进程,自己管理进程的方式,可以比较简单的解决此类问题。
比如代码修改成如下样子,即可正常运行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import multiprocessing class exampleProcess: def __init__(self): self.process = multiprocessing.Process(target=self.run,args=(60,)) def run(self,args): print args def runProcess(self): self.process.start() self.process.join() if __name__ == '__main__': process = exampleProcess() process.runProcess() |
至于多进程的管理,则只需要使用
1 |
from multiprocessing import Process, Queue |
引入multiprocessing
模块的Queue
,实现一个简单的生产者,消费者模型即可。