"Globale" Variablen für mehrere Threads

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.
el_bobo
User
Beiträge: 23
Registriert: Dienstag 15. Januar 2008, 02:11

"Globale" Variablen für mehrere Threads

Beitragvon el_bobo » Samstag 22. März 2008, 04:10

Hallo zusammen,

ich habe folgendes Problem:
Mehrere Threads sollen auf einige Variablen (u.a. auch Objektinstanzen) Lesezugriff haben. Ein Beispiel dafür wäre eine zentrale config.py mit irgendwelchen Konfigurationsvariablen.

Frage:
Kann ich das einfach so lösen:

Code: Alles auswählen

# Datei config.py
my_int = 5
my_string = "abc"

def get_my_int():
    return my_int
# ...


Und dann in den Threads:

Code: Alles auswählen

import threading
import config
# ...

class my_thread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.my_int = config.get_my_int()
        # ...
    # ...


Die Funktionen sind nur Wrapper, um eventuell später mal die Funktionalität zu ändern.
Also die eigentliche Frage ist: muss ich da was locken oder ist das bei reinen Lesezugriffen egal?

Vielen Dank schon mal und schöne Grüße,
el_bobo
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Beitragvon sma » Samstag 22. März 2008, 10:59

Nur lesen ist harmlos, aber sobald auch nur ein Thread schreibt, müssen prinzipiell alle anderen selbst zum Lesen locken, um nicht nur Teile zu lesen.

Oder garantiert Pythons global-interpreter-lock (GIL), dass sowieso immer nur ein einziger Thread im Interpreter läuft? Dann wäre es harmlos, solange das nicht irgendwelche Pseudo-Attribute sind, die über C-Funktionen auf Daten in einer C-Extension zugreifen.

Stefan
BlackJack

Beitragvon BlackJack » Samstag 22. März 2008, 11:34

Ich würde sagen das GIL garantiert das, *aber* es gibt keine Garantie dafür, dass es ein GIL gibt. Jython und IronPython haben das nicht, und auch bei CPython gibt's immer mal wieder Leute, die es loswerden wollen und die Antwort bekommen: Na dann implementier's doch. Hat bis jetzt noch niemand gemacht, aber das muss ja nichts heissen. :-)
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Samstag 22. März 2008, 12:42

Um ein Lock wirst du mit Sicherheit nicht rumkommen, da du sicherlich nicht die Variablen einfach nur liest oder setzt, sondern komplexere Berechnungen zwischen einem Auslesen und einer Zuweisung für den neuen Wert durchgeführt werden. Ohne einen entsprechenden Schutz hättest du zwischenzeitlich unter Unständen undefinierte Zustände. Bei diesem Problem kann dir dann auch kein GIL mehr helfen.
el_bobo
User
Beiträge: 23
Registriert: Dienstag 15. Januar 2008, 02:11

Beitragvon el_bobo » Samstag 22. März 2008, 13:04

Hm ok, danke für die Antworten.
Bei der Kommunikation zwischen den Threads verwende ich schon Queues und Events. Hier gehts wirklich nur ums auslesen fester Werte.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 22. März 2008, 14:06

BlackJack hat geschrieben:Hat bis jetzt noch niemand gemacht, aber das muss ja nichts heissen. :-)

Doch, dabei wurde der GIL durch viele kleinere Locks ersetzt und die Performance ist wegen dem vielen Locking dann gesunken. Quelle.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Beitragvon BlackJack » Samstag 22. März 2008, 14:13

Ich meinte ein aktuelles CPython.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Don Terremoto, SmombieTV