Browse Source

finale Version.

develop teil12
Olli Graf 2 years ago
parent
commit
0982608da1
  1. 35
      teil12/pool_squares.py
  2. 2000
      teil12/zahlen.txt

35
teil12/pool_squares.py

@ -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()

2000
teil12/zahlen.txt

File diff suppressed because it is too large
Loading…
Cancel
Save