vielen Dank für das beispiel.
Ich habe die run fkt noch etwas abgewandelt, damit ich mir die funktionsweise besser veranschaulichen kann:
Code: Alles auswählen
def run(self):
print ("Calculating {}".format(self.name))
randomnumber = random.randint(1, 5)
print("radomnumber für {} ist {}".format(self.name, randomnumber))
time.sleep(randomnumber)
result = random.randint(1, 42)
print ("{} = {}".format(self.name, result))
self.result = result
Eine Ausgabe ist nun zb.:
Calculating spam
radomnumber für spam ist 4
Calculating ham
radomnumber für ham ist 4
Calculating eggs
sum = 0
radomnumber für eggs ist 5
spam = 18
ham = 28
eggs = 40
Der Vorgang hat 5 sekunden gedauert, anstatt 4+4+5=13 sekunden
Nur erschließst sich mir "sum" noch nicht... ist es gewollt, dass dort jedesmal sum=0 steht? Das wort sum lässt ja mutmaßen, dass es sich eigentlich um eine Summe aus den drei variablen handeln soll ^^
Die funktionsweise von map() habe ich denke ich verstanden. Sie sorgt dafür, dass nacheinander jeder der darauffolgenden Parameter and die Klasse Foo übergeben werden.
Die Aufgabe von "join()" ist mir noch nicht klar. Als erklärung fand ich:
"Die join()-Methode stellt sicher, dass das Hauptprogramm wartet, bis alle Threads terminiert haben. "
Aber was heißt terminiert?
ich vermute mal, dass also gewartet wird, bis alle threads gestartet haben, oder fertig durchlaufen sind... vermutlich letzteres oder? Angenommen es ist letzteres. Das heißt dann also, dass eigentlich nun gewartet werden sollte, bis alle threads ihre Variablen vergeben haben und er dann mit print("sum=" weitergemacht werden sollte? Heißt das also, dass join() hier nicht korrekt funktioniert? Oder vermute ich komplett falsch und join() ist für was anderes da?
edit: nach kurzer Überlegund und Betrachtung der Ausgabe komme ich zu dem Schluss, dass join() nur wartet, bis jeder Thread gestartet ist, nicht bis sie fertig sind. Das erklärt also auch warum sum=0 ist, weil zu dem zeitpunkt noch keine werte vergeben sind. Und wir sehen in der Ausgabe ja, dass sum=0 direkt nach dem start des letzten Threads ausgeben wird.
Gibt es denn auch eine Funktion wie join(), die bis zum Ende jedes Threads wartet?
edit2:
und heißt das im Klartext, dass ich nun alles was ich so parallel machen machen will, in die run funktion schreiben muss? Auf mein Beispiel bezogen, würde ich dann z.b die werte 1,2 und 3 an die Klasse übergeben, damit die run funktion dann dafür sorgt, dass API 1,2 und 3 aufgerufen werden, richtig?
edit3:
es gibt ja noch irgendwelche "is_alive" sachen. Heißt das, dass ich threads eventuell noch "beenden" muss, oder brauche cih sowas in diesem Fall nicht?
fertig editiert ^^