Globale Variable in Thread

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
AdriBloober
User
Beiträge: 17
Registriert: Samstag 17. Februar 2018, 20:09

Samstag 14. Juli 2018, 21:12

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?
Sirius3
User
Beiträge: 8804
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
AdriBloober
User
Beiträge: 17
Registriert: Samstag 17. Februar 2018, 20:09

Samstag 14. Juli 2018, 21:57

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
Benutzeravatar
__blackjack__
User
Beiträge: 1579
Registriert: Samstag 2. Juni 2018, 10:21

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.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
AdriBloober
User
Beiträge: 17
Registriert: Samstag 17. Februar 2018, 20:09

Samstag 14. Juli 2018, 22:50

__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.
AdriBloober
User
Beiträge: 17
Registriert: Samstag 17. Februar 2018, 20:09

Samstag 14. Juli 2018, 23:13

Außerdem wieso sollte man global nicht benutzen, gibt es da noch andere Methoden, die global ersetzen könnten oder wie soll dass gehen?
Benutzeravatar
__blackjack__
User
Beiträge: 1579
Registriert: Samstag 2. Juni 2018, 10:21

Samstag 14. Juli 2018, 23:40

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

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Antworten