Seite 1 von 1

Threading @ python3 Rückgabe eines wertes

Verfasst: Montag 13. Oktober 2014, 15:47
von evd
Hallo zusammen

Ich habe mal eben eine Frage... auf die ich einfach keine Lösung finden will...

Ich will eine vielzahl an threads (hier 50) starten, eine Langwierige (und auch Längliche, deswegen hier symbolisiert durch i+5) Tätlichkeit ausführen und deren Ergebnis wieder dem Hauptprogramm zurück geben.

Code: Alles auswählen

import threading

geber=0
nehmer=0

def dierechnung(i):
    neu=i+5                              #Berechnung
    schleifenende=0                    #Zeile 8-11: testen ob Speicher für Rückgabe frei ist
    while schleifenende==0:
        if i==nehmen+1:
            schleifenende=1
            #rückgabe von "neu"
            geben = geben +1          #dem Hauptprogramm sagen das wer zur abfrage bereit
    
def dieausgabe():
    for starter in range(1,50):        #Zeile 16-17: threads starten
        Ergebnis=threading.Thread(target = Affenkopf(starter)).start()
    for anehmen in range (1,50):    #Anzahl der gestarteten threads, beginn der Abfrage
        while geben==nehmen:       #Zeile 19-20: werten bis NEUER wert in variable gespeichert ist
            pass
        neu2=Ergebnis                   
        print(neu2)
        nehmen=anehmen              #bereit machen für neuen input

dieausgabe()
kann sein das ich da gerade voll den Bockmist gebaut habe.... aber ich habe keine ahnung wie ich das sonst machen kann...
a) teilen sich threads und das Hauptprogramm, genauso wie Objekte ihre Variablen (ohne "self.") oder war ich da schon auf dem Falschen dampfer?
b)wie bekomme ich ein Rückgabewert... ergo das Ergebnis der Berechnung aus dem Thread?

join() kann ich nicht benutzen, den dann würde ich ja auf ein bestimmten Thread warten, habe ja aber 50 gleichzeitig am laufen...
return () gibts nicht ... wie ich gesehen habe ... Ich glaube ich verwechsle das zu stark mit Objekten XD

könnt ihr mir da helfen, würde mich freuen...

Re: Threading @ python3 Rückgabe eines wertes

Verfasst: Montag 13. Oktober 2014, 16:30
von BlackJack
@evd: Vergiss am besten gleich irgendwelche globalen Variablen. Die einfachste, sichere Methode zwischen Threads zu kommunizieren sind `Queue`-Objekte aus dem `Queue`-Modul.

Re: Threading @ python3 Rückgabe eines wertes

Verfasst: Mittwoch 15. Oktober 2014, 15:52
von evd
sorry, aber bin ich jetzt vollkommen verrückt geworden?

startet nicht "threading.Thread(target=DerThread()).start()" ein Thread von DerThread?
wenn ich das so mache, wartet mein Hauptprogramm immer darauf das der Thread abgeschlossen wird... als ob ich ".join()" dabei hätte...

Code: Alles auswählen

def DerThread():
        time.sleep(5)
        print("gemacht")
for s in range (3):
    threading.Thread(target=DerThread()).run()
    print("starte",s)


ich glaube mit dem Threading habe ich mir was angelacht XD
Wo könnte ich das den gut nachlesen?
die Seite von "docs.python.org" ist zwar schön und gut.... aber bringt mich da nicht weiter...
und die meisten Seiten die ich finde habe das so, oder sind zu python2

Re: Threading @ python3 Rückgabe eines wertes

Verfasst: Mittwoch 15. Oktober 2014, 16:11
von BlackJack
@evd: Du musst als `target` die *Funktion* übergeben und nicht die Funktion *aufrufen* und deren Rückgabwert übergeben.

Re: Threading @ python3 Rückgabe eines wertes

Verfasst: Mittwoch 15. Oktober 2014, 16:33
von Sirius3
@evd: Und Du rufst nicht die start-Methode auf, sondern run, das dann das Target auch direkt ausführt.