|
|
@ -1,5 +1,4 @@ |
|
|
|
#encoding: UTF-8 |
|
|
|
#Quelle: https://stackoverflow.com/questions/6976372/mulitprocess-pools-with-different-functions |
|
|
|
|
|
|
|
import datetime |
|
|
|
from timeit import default_timer as timer |
|
|
@ -10,19 +9,23 @@ from multiprocessing import Pool |
|
|
|
|
|
|
|
__verbose__ = False |
|
|
|
|
|
|
|
# gibt den String s nur aus, wenn __verbose__ True ist. |
|
|
|
def print_verbose(s): |
|
|
|
if __verbose__: |
|
|
|
print(s) |
|
|
|
|
|
|
|
# Arbeitsfunktion läuft in der Zahlenliste von start bis ende |
|
|
|
# und summiert die Quadratzahlen in dem Bereich auf. |
|
|
|
# Die Methode wird in jedem Prozess mit unterschiedlichen Werten |
|
|
|
# für start und ende abgearbeitet. |
|
|
|
def calc_sum_square(zahlen, *args,**kwargs): |
|
|
|
print(f'calc_sum_square() {args}') |
|
|
|
time.sleep(1.0) |
|
|
|
start = kwargs['start'] |
|
|
|
ende = kwargs['end'] |
|
|
|
threadnr = kwargs['threadnr'] |
|
|
|
summe = 0 |
|
|
|
|
|
|
|
# print_verbose(f'x={x}') |
|
|
|
# time.sleep(1.0) |
|
|
|
# print_verbose(f'kwargs={kwargs}') |
|
|
|
print_verbose(f'von {start} bis {ende}') |
|
|
|
for n in range(start,ende): |
|
|
|
i = zahlen[n] |
|
|
@ -31,30 +34,42 @@ def calc_sum_square(zahlen, *args,**kwargs): |
|
|
|
|
|
|
|
return summe |
|
|
|
|
|
|
|
# Diese Methode wird initial pro Prozess von der Poolsteuerung aufgerufen und |
|
|
|
# steuert die Verteilung der Parameter. |
|
|
|
# f ist der Zeiger auf die aufzurufende Methode |
|
|
|
# *arg wnthält das Tupel mit den Argumenten |
|
|
|
# |
|
|
|
def smap(f, *arg): |
|
|
|
|
|
|
|
# Auflösen des Tupels: args enthält die Liste mit den Zahlen, |
|
|
|
# kwarg das Dictionary mit den Parametern für jeden Prozess |
|
|
|
args, kwargs = arg |
|
|
|
|
|
|
|
# print(f'smap() args= {args}') |
|
|
|
time.sleep(1.0) |
|
|
|
# print(f'smap() kwargs={kwargs}') |
|
|
|
time.sleep(1.0) |
|
|
|
return f(list(args), **kwargs) |
|
|
|
# Aufruf der übergebenen Funktion mit den Parametern |
|
|
|
return f(args, **kwargs) |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
|
|
|
|
|
|
|
|
start = timer() |
|
|
|
# Liste mit 10 Mio Integerzahlen anlegen. |
|
|
|
zahlen = [i for i in range(10000000)] |
|
|
|
ende = timer() |
|
|
|
print(f'Zahlenliste erzeugt in {ende-start}s') |
|
|
|
|
|
|
|
split = int(len(zahlen) / 3) |
|
|
|
print(f'split={split}') |
|
|
|
print_verbose(f'split={split}') |
|
|
|
time.sleep(1.0) |
|
|
|
|
|
|
|
start = timer() |
|
|
|
# Pool mit drei Prozesssen |
|
|
|
with Pool(processes=3) as pool: |
|
|
|
# Die Methode pool.starmap() bekommt neben der aufzurufenden Methode smap() eine Liste von Tupeln. |
|
|
|
# Jedes Tupel enthält pro Prozess die auszuführende Methode, die Liste mit den Zahlen und ein Dictionary mit |
|
|
|
# den Parametern 'threadnr', 'start' und 'end' |
|
|
|
# starmap() wartet solange, bis alle drei Teilprozesse beendet sind und gibt dann eine Liste mit den return Werten |
|
|
|
# zurück. |
|
|
|
result = pool.starmap(smap, [(calc_sum_square, zahlen, {'threadnr':1,'start':0, 'end':split}), (calc_sum_square, zahlen, {'threadnr':2,'start':split+1,'end':split*2}), (calc_sum_square, zahlen,{'threadnr':3,'start':(split*2)+1,'end':split*3})]) |
|
|
|
print(f'Ergebnis: {result}') |
|
|
|
ende = timer() |
|
|
|