RuntimeError ошибок Python в Windows для многопроцессорной обработки

Я пытаюсь Threading и Multiprocessing для python на машине с Windows. Но python выдает следующее сообщение.

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.

В окнах, если name == 'main': именно поэтому это должно быть сделано, и у меня было реализовано следующее, но в, чтобы решить После того, как будут происходить такие ошибки или это ситуация, которую я не знаю. Помогите мне, пожалуйста.

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]"

1 ответ

В Windows нет вызова os.fork(), поэтому python запускает ваш скрипт с начала для каждого нового процесса, кроме кода, заключенного в

if __name__ == '__main__':
    ...

В вашем случае вам нужно создавать процессы Pool только в основном потоке, поэтому перенесите инициализацию пула в эти разделы (или функции, которые вызываются из этого раздела):

if __name__ == '__main__':  
    pool = multiprocessing.Pool(4)
    for var in range(0,5):
        ...
Другие вопросы по тегам