Windows上python occer的RuntimeError进行多处理 [英] RuntimeError of python occers on windows to multiprocessing

查看:109
本文介绍了Windows上python occer的RuntimeError进行多处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在Windows机器上尝试python的线程和多处理.但是python给出以下信息.

I am trying Threading and Multiprocessing for python on a windows machine.But python give the following message.

RuntimeError: 
            Attempt to start a new process before the current process
            has finished its bootstrapping phase.
            This probably means that you are on Windows and you have
            forgotten to use the proper idiom in the main module:
                if __name__ == '__main__':
                    freeze_support()
                    ...
            The "freeze_support()" line can be omitted if the program
            is not going to be frozen to produce a Windows executable.

在Windows中,如果name =='main':因此必须完成,我执行了以下操作,但是要解决After怎么会发生此类错误,或者我要解决的情况不知道. 请帮助我.

In windows if name == 'main': it was therefore that of the must be done and I had a implemented as follows, but in, to solve After how the will happening such errors or it is a situation that I do not know. please help me.

import random
import numpy
import matplotlib.pyplot
import time
import multiprocessing

from deap import algorithms
from deap import base
from deap import creator
from deap import tools
# from docutils.utils.punctuation_chars import delimiters
IND_INIT_SIZE = 3000 
# MIN_ENERGY = 237178.013392/3600 
MIN_ENERGY =7255 
MIN_POWER = 303.4465137486
NBR_ITEMS = 3000 

# Create the item dictionary: item name is an integer, and value is
# a (weight, value) 2-uple.
items = {}
# Create random items and store them in the items' dictionary.
for i in range(NBR_ITEMS):
    items[i] = random.choice([[10,5],[10,10]])

creator.create("Fitness", base.Fitness, weights=(-1.0, -1.0))
creator.create("Individual", set, fitness=creator.Fitness)

toolbox = base.Toolbox()

# Attribute generator
toolbox.register("attr_item", random.randrange, NBR_ITEMS)

# Structure initializers
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_item, IND_INIT_SIZE)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

def evalKnapsack(individual):
    energy = 0.0
    power = 0.0
    for item in individual:
        energy += items[item][1]
        power += items[item][0]
    if power < MIN_POWER or energy < MIN_ENERGY:
        return 100000000000,1000000000000
    return energy, power

def cxSet(ind1, ind2):
    """Apply a crossover operation on input sets. The first child is the
    intersection of the two sets, the second child is the difference of the
    two sets.
    """
    temp = set(ind1)                # Used in order to keep type
    ind1 &= ind2                    # Intersection (inplace)
    ind2 ^= temp                    # Symmetric Difference (inplace)
    return ind1, ind2

def mutSet(individual):
    """Mutation that pops or add an element."""
    for var in range(0,3000):
        if random.random() < 0.5:
            if len(individual) > 0:     # We cannot pop from an empty set
                individual.remove(random.choice(sorted(tuple(individual))))
            else:
                individual.add(random.randrange(NBR_ITEMS))
    return individual,

toolbox.register("evaluate", evalKnapsack)
toolbox.register("mate", cxSet)
toolbox.register("mutate", mutSet)
toolbox.register("select", tools.selSPEA2)
pool = multiprocessing.Pool(4)
toolbox.register("map", pool.map)

def main():
#     random.seed(64)
    NGEN = 5
    MU = 75
    LAMBDA = 75
    CXPB = 0.6
    MUTPB = 0.3

    pop = toolbox.population(n=MU)
    hof = tools.ParetoFront()
    stats = tools.Statistics(lambda ind: ind.fitness.values)
    stats.register("avg", numpy.mean, axis=0)
    stats.register("std", numpy.std, axis=0)
    stats.register("min", numpy.min, axis=0)
    stats.register("max", numpy.max, axis=0)

    algorithms.eaMuPlusLambda(pop, toolbox, MU, LAMBDA, CXPB, MUTPB, NGEN, stats,
                              halloffame=hof)
    return pop, stats, hof
if __name__ == '__main__':  
    for var in range(0,5):
        start = time.time()
        pop, stats, hof= main()
        lischp=[]
        lisclp=[]
        libatthp=[]
        libattlp=[]
        ligoukei=[]
        for ind in hof:
            itemslist=[]
            print ind, ind.fitness
            for k in ind:
                itemslist.append(items[k])
            schpkazu=itemslist.count([10,5])
            lischp.append(schpkazu)
            battlpkazu=itemslist.count([10,10])
            libattlp.append(battlpkazu)
        print libatthp
        print lischp
        print libattlp
        print lisclp
        ligoukei.append(ind.fitness)
        print ligoukei
        #保存
        with open('battlpcazu.csv',mode='a')as fb:
            numpy.savetxt(fb,libattlp,fmt="%.0f",delimiter=",")
        with open('schpcazu.csv',mode='a')as fc:
            numpy.savetxt(fc,lischp,fmt="%.0f",delimiter=",")

        elapsed_time = time.time() - start
        print ("elapsed_time:{0}".format(elapsed_time)) + "[sec]"

推荐答案

在Windows上没有os.fork()调用,因此python从头开始运行脚本 对于每个新进程,除了用

There is not os.fork() call on windows, so python runs your script from beginning for each new process except code that wrapped with

if __name__ == '__main__':
    ...

在您的情况下,您只需要在主线程中创建进程Pool,因此请将池初始化移至本节(或从本节调用的函数)中:

In your case you need to create processes Pool only in main thread, so move pool initialization into this sections (or functions that called from this section):

if __name__ == '__main__':  
    pool = multiprocessing.Pool(4)
    for var in range(0,5):
        ...

这篇关于Windows上python occer的RuntimeError进行多处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆