2016-01-18 5 views
0

Я пытаюсь Threading и многопроцессорность для python на машине Windows. Но питон дает следующее сообщение.RuntimeError of python occers на окнах для многопроцессорности

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. 

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

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

ответ

0

Существует не os.fork() вызов на окнах, так что питон запускает сценарий от начала для каждого нового процесса, за исключением кода, который обматывают

if __name__ == '__main__': 
    ... 

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

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

Большое спасибо. Тем не менее, я выполнил четыре процесса: у меня была не одна операция (CPU = 0% в диспетчере задач, а процесс перемещения 25%). Если я хочу многопроцессорно, есть ли что-то делать к чему-то еще –