2016-08-05 7 views
0

Generieren der Summe von Addieren von ganzen Zahlen nacheinander bis zu n wobei n = 2000 durch die folgende Formel gegeben: n (n + 1)/2 bisher habe ich es in serial.I müssen Hilfe, um es parallel zu berechnen, so dass es adaptiv alle verfügbaren Prozessoren/Kerne auf dem Host-Computer nutzt.parallel Programm in Python mit Threads

#!/usr/bin/env python3 
from datetime import datetime 
n=1 
v=0 
start_time = datetime.now() 
while n<=10: 

(n*(n+1)/2) 
b=(n*(n+1)/2) 
n = n+1 

end_time =datetime.now() 

print (b) 

print('Time taken : {}'. format(end_time-start_time)) 

Antwort

0

Um dies zu tun, müssen Sie multiprocessing verwenden, mit dem Sie Prozesse erstellen und zuweisen Prozeduren zu ihnen. Hier ist ein Code-Schnipsel, die Teil tut, was Sie wollen:

#!/usr/bin/env python3 

from datetime import datetime 

MAX_NUM = 10000000 
NUMPROCS = 1 

# LINEAR VERSION 
start_time = datetime.now() 
my_sum = 0 
counter = 1 
while counter <= MAX_NUM: 
    my_sum += counter 
    counter += 1 
end_time =datetime.now() 

print (my_sum) 
print('Time taken : {}'. format(end_time-start_time)) 

# THREADING VERSION 
from multiprocessing import Process, Queue 

start_time = datetime.now() 

def sum_range(start,stop,out_q): 
    i = start 
    counter = 0 
    while i < stop: 
     counter += i 
     i += 1 
    out_q.put(counter) 

mysums = Queue() 
mybounds = [1+i for i in range(0,MAX_NUM+1,int(MAX_NUM/NUMPROCS))] 
myprocs = [] 

for i in range(NUMPROCS): 
    p = Process(target=sum_range, args=(mybounds[i],mybounds[i+1],mysums)) 
    p.start() 
    myprocs.append(p) 

mytotal = 0 
for i in range(NUMPROCS): 
    mytotal += mysums.get() 

for i in range(NUMPROCS): 
    myprocs[i].join() 

print(mytotal) 
end_time =datetime.now() 
print('Time taken : {}'. format(end_time-start_time)) 

Obwohl der Code adaptiv nicht-Prozessoren verwenden, ist es die Aufgabe in einer vorgegebenen Anzahl von Prozessen nicht teilt.

+0

Dies ist der Fehler, den ich bekomme, wenn ich es starten Runtime: Ein Versuch, einen neuen Prozess zu starten, bevor der aktuelle Prozess seine Bootstrapping Phase vorgenommen wurde beendet. Das bedeutet wahrscheinlich, dass Sie sich nicht mit Gabel sind Ihre Child-Prozesse zu starten und Sie haben die richtige Idiom im Hauptmodul zu verwenden, vergessen: wenn __name__ == ‚__main__‘: freeze_support() ... Die Zeile "freeze_support()" kann weggelassen werden, wenn das Programm nicht eingefroren wird, um eine ausführbare Datei zu erzeugen. –