Seite 1 von 1

Globale Variable in Thread

Verfasst: Samstag 14. Juli 2018, 21:12
von AdriBloober
Hey,

Code: Alles auswählen

import threading
def function():
#threadfunction
global a
a = True

T = threading.Thread(target=function)
T.start()
print(a)
:
a is undefinded
Wieso?

Re: Globale Variable in Thread

Verfasst: Samstag 14. Juli 2018, 21:44
von Sirius3
Die Einrückungen sind kaputt. Und neben der Regel, dass man global nicht benutzen sollte, gibt es noch die zweite Regel, dass man global niemals mit Threads benutzen darf, weil das zu undefiniertem Verhalten führt.

Re: Globale Variable in Thread

Verfasst: Samstag 14. Juli 2018, 21:57
von AdriBloober
Sirius3 hat geschrieben: Samstag 14. Juli 2018, 21:44 Die Einrückungen sind kaputt. Und neben der Regel, dass man global nicht benutzen sollte, gibt es noch die zweite Regel, dass man global niemals mit Threads benutzen darf, weil das zu undefiniertem Verhalten führt.
Ja die Einrückung mal bitte nicht beachten, okay danke, was könnte man denn als alternative Methode benutzen.

Lg AdriBloober

Re: Globale Variable in Thread

Verfasst: Samstag 14. Juli 2018, 22:16
von __blackjack__
@AdriBloober: Alternative zu was? Was ist denn hier das Ziel? Grundsätzlich: Was die Funktion braucht als Argument(e) übergeben. Wenn die Funktion ein Flag signalisieren soll, dann gibt's dafür Datentypen im `threading`-Modul. Wenn sie Werte am Ende (oder mitten drin) in einen anderen Thread übertragen soll, kann man eine `queue.Queue` verwenden. Grundsätzlich würde ich erst einmal schauen ob das `concurrent.futures`-Modul nicht einfacher ist.

Re: Globale Variable in Thread

Verfasst: Samstag 14. Juli 2018, 22:50
von AdriBloober
__blackjack__ hat geschrieben: Samstag 14. Juli 2018, 22:16 @AdriBloober: Alternative zu was? Was ist denn hier das Ziel? Grundsätzlich: Was die Funktion braucht als Argument(e) übergeben. Wenn die Funktion ein Flag signalisieren soll, dann gibt's dafür Datentypen im `threading`-Modul. Wenn sie Werte am Ende (oder mitten drin) in einen anderen Thread übertragen soll, kann man eine `queue.Queue` verwenden. Grundsätzlich würde ich erst einmal schauen ob das `concurrent.futures`-Modul nicht einfacher ist.
Also, ich möchte einfach eine Variable, die im Thread definiert habe, in meinem HauptThread nutzen.

Re: Globale Variable in Thread

Verfasst: Samstag 14. Juli 2018, 23:13
von AdriBloober
Außerdem wieso sollte man global nicht benutzen, gibt es da noch andere Methoden, die global ersetzen könnten oder wie soll dass gehen?

Re: Globale Variable in Thread

Verfasst: Samstag 14. Juli 2018, 23:40
von __blackjack__
@AdriBloober: Wie willst Du denn eine Variable benutzen wenn Du gar nicht weisst wann sie einen Wert hat/bekommt oder wann er geändert wird? Genau *das* ist ja das Problem in Deinem ersten Beitrag, das Du versuchst `a` zu verwenden bevor der Thread es überhaupt gesetzt hat. Irgendwie musst Du den gleichzeitigen Zugriff koordinieren und absichern. Und so ganz erklärt das auch nicht was Du eigentlich machen willst, denn Du sagst ja nur wie Du denkst das Du das Problem lösen willst (globale Variable) aber nicht was das Problem ist was so gelöst werden soll.

Globale Variablen machen ”normalen” Code schon schwer zu verstehen, zu testen, und wiederzuverwenden, weil es nicht mehr reicht sich die Schnittstellen der Funktionen anzuschauen, sondern man muss auch in alle Funktionen rein schauen um heraus zu finden wo und unter welchen Bedingungen die globalen Variablen benutzt und verändert werden. Bei Threads wird es dann auch noch schwierig die genaue Reihenfolge zu erkennen, weil dann ja mehrere Codestränge gleichzeitig auf den globalen Daten operieren können.