关于 Pool 放在类内部无用 or 报错的问题
这是因为多进程之间要使用pickle来序列化并传递一些数据,但是实例方法并不能被pickle,pickle传递给pool的对象的时候,这个对象就包含pool这个实例变量,它不能被pickle,造成错误.
解决方法就是自己实现getstate方法,它是决定什么需要pickle的函数,我们删除掉pool,不让它pickle就好了。setstate作用是相反的,是用来增加实例变量的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| from multiprocessing.pool import Pool from time import sleep
from multiprocessing import Process
class A(): def __init__(self): super().__init__() self.pool = Pool() self.initPool()
def test(self, name): while True: print(name) sleep(1)
def initPool(self): self.pool.map_async(self.test, range(4)) self.pool.close()
def run(self): self.pool.join()
def __getstate__(self): self_dict = self.__dict__.copy() del self_dict['pool'] return self_dict
def __setstate__(self, state): self.__dict__.update(state)
if __name__ == '__main__': a = A() a.run()
|
子进程异常
apply_async返回的是AsyncResult,其中出现的异常只有在调用AsyncResult.get()的时候才会被重新引发