关于 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()的时候才会被重新引发