如何重用池中的工人进行遗传算法

How to reuse workers from Pool for a genetic algorithm

我之前有一个关于这个问题的相关问题:

我有一个遗传算法,我试图通过并行化评估函数来加快速度。 GA 是 class,代码看起来像这样:

copy_reg.pickle(types.MethodType,lambda method: (getattr, (method.im_self, method.im_func.__name__)),getattr) 

class GA:

    ...
    ...

    def evaluation(self):
        self.scores = Pool(processes=nprocs).map(self.costly_function,self.population)

    def run(self):
        self.initial_population()
        self.evaluation()
        while self.Gen > i:
            self.select()
            self.crossover()
            self.mutation()
            self.evaluation()
            i += 1

与顺序方法相比,这给出了正确的结果,但速度明显较慢。我的猜测是,这是因为我在函数 evaluation 的 while 循环内为每一代创建了一组新的流程工作者。有没有一种方法可以重用工人,这样我就可以加快速度?

通过添加我从

获得的函数解决了问题
def __getstate__(self):
    self_dict = self.__dict__.copy()
    del self_dict['pool']
    return self_dict

def __setstate__(self, state):
    self.__dict__.update(state)