Threading @ python3 Rückgabe eines wertes

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

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...
BlackJack

@evd: Vergiss am besten gleich irgendwelche globalen Variablen. Die einfachste, sichere Methode zwischen Threads zu kommunizieren sind `Queue`-Objekte aus dem `Queue`-Modul.
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

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
BlackJack

@evd: Du musst als `target` die *Funktion* übergeben und nicht die Funktion *aufrufen* und deren Rückgabwert übergeben.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@evd: Und Du rufst nicht die start-Methode auf, sondern run, das dann das Target auch direkt ausführt.
Antworten