Seite 1 von 1

Multicore Programmierung mit mehreren Variablen

Verfasst: Freitag 27. Juli 2018, 21:57
von g123
Hallo Leute,
probiere momentan meinen Code durch Multicore Processing schneller laufen zu lassen.
Jedoch kann man der Methode .map nur eine Variable übergeben, ich hab das ganze probiert mit Listen von Listen zu lösen, jedoch braucht mein Code durch dieses erstellen der Listen von Listen viiiiilel länger als im single core Durchlauf. Kennt ihr eine bessere Lösung?
Hier mal ein Beispiellcode von meinem Vorgehen:

Code: Alles auswählen

def add(a, b, c):
    x = a + b + c
    print(x)


CPUS = multiprocessing.cpu_count()
WORKERS = multiprocessing.Pool(processes=CPUS)

Tasklist1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
Tasklist2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
Tasklist3 = [1, 2, 3, 4, 5, 6, 7, 8, 9]

a = []
i = 0
while i < len(Tasklist1):
    a.append([Tasklist1[i], Tasklist2[i], Tasklist3[i]])
    i += 1


WORKERS.starmap(add, a)

Re: Multicore Programmierung mit mehreren Variablen

Verfasst: Samstag 28. Juli 2018, 05:27
von __deets__
Bitte gewöhn dir die Namenskonventionen für Python wie in PEP8 beschrieben an - KONSTANTEN werden groß geschrieben, KlassenHabenCamelCase, und variablen_sind_klein_mit_unterstrich.

Bei dir geht das alles wild durcheinander, und verwirrt dadurch.

Das ganze CPU-count-Gedöns kannst du dir sparen, multiprocessing macht das automatisch.

Und deine Liste a entsteht ganz einfach durch

a = zip(Teilliste1, Teilliste2, Teilliste3)

Zu deinem Problem: es ist ziemlich viel Aufwand, diverse Prozesse hochzufahren, und zwischen ihnen zu kommunizieren. Das hat zur Folge, das nicht jedes triviale Problem davon profitiert, so wie deines. Sondern erst bei entsprechend vielen Daten eine Verbesserung zu bemerken ist. Und zweitens erzwingst du durch die print-Anweisungen mindestens mal ein langsames warten auf IO, und schlimmstenfalls sogar eine serialisierung aller Aufgaben.

Re: Multicore Programmierung mit mehreren Variablen

Verfasst: Samstag 28. Juli 2018, 08:48
von __blackjack__
Zusätzlich zu dem Aufwand den __deets__ beschrieben hat, kommt auch noch das die Ergebnisse der Aufrufe alle zu dem startenden Prozess zurückgemeldet werden und dort in die richtige Reihenfolge gebracht werden müssen und auch Ausnahmen zurück kommuniziert werden. Aufwand den Du überhaupt nicht brauchst, weil Du keines der Ergebnisse verwendest. Bei den Ausnahmen wird aus Deinem Code nicht klar, welches Verhalten Du Dir da wünschen würdest. Also ob Du darüber informiert werden möchtest, oder ob das die anderen Berechnungen nicht stoppen soll.