Python 使用HTCondor的DEAP替代方案进行多处理

Python 使用HTCondor的DEAP替代方案进行多处理,python,multiprocessing,deap,condor,Python,Multiprocessing,Deap,Condor,我在Windows Server 2016上使用DEAP,并且在多处理器方面不断遇到问题,要么它生成的作业数与CPU数不一样,要么它在一段时间后停止,并且似乎挂起。我实际上运行了一个外部.NET进程并返回一个值,该值稍后由DEAP优化程序读取 if self.n_jobs == 0: raise ValueError("n_jobs == 0 has no meaning.") elif self.n_jobs > 1: pool = multiproc

我在Windows Server 2016上使用DEAP,并且在多处理器方面不断遇到问题,要么它生成的作业数与CPU数不一样,要么它在一段时间后停止,并且似乎挂起。我实际上运行了一个外部.NET进程并返回一个值,该值稍后由DEAP优化程序读取

if self.n_jobs == 0:
    raise ValueError("n_jobs == 0 has no meaning.")
elif self.n_jobs > 1:
    pool = multiprocessing.Pool(processes=self.n_jobs)
    toolbox.register("map", pool.map)
elif self.n_jobs < 0:
    pool = multiprocessing.Pool(processes=max(cpu_count() + 1 + self.n_jobs, 1))
    toolbox.register("map", pool.map)

pop = toolbox.population(n=self.n_population)
hof = tools.HallOfFame(1, similar=np.array_equal)

stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("avg", np.mean, axis=0)
stats.register("std", np.std, axis=0)
stats.register("min", np.min, axis=0)
stats.register("max", np.max, axis=0)

if self.verbose > 0:
    print("Selecting features with genetic algorithm.")

_, log = _eaFunction(pop, toolbox, cxpb=self.crossover_proba, mutpb=self.mutation_proba,
                     ngen=self.n_generations, ngen_no_change=self.n_gen_no_change,
                     stats=stats, halloffame=hof, verbose=self.verbose)
if self.n_jobs != 1:
    pool.close()
    time.sleep(2)
    pool.join()
这是代码的摘录,我遵守了文档中的注释,但它仍然不可靠。从文档中:

“警告如多处理指南中所述,在Windows下,由于进程的初始化方式,必须在ifname==”main“部分中保护进程池。”

另外,作为一种解决方法,是否可以只使用HTCondor/pycondor并删除DEAP多处理器池,然后从那里运行作业,因为我已经每次调用外部进程了

def main():
    #set_start_method("spawn")
    genetic = Genetic_markov_selection(
                              verbose=1,
                              n_population=40,
                              crossover_proba=0.5,
                              mutation_proba=0.3,
                              n_generations=40,
                              crossover_independent_proba=0.5,
                              mutation_independent_proba=0.05,
                              tournament_size=3,
                              n_gen_no_change = 40,
                              caching=True,
                              n_jobs=-1)
    genetic.fit()

if __name__ == '__main__':   main()