[Python-de] threads - noch mehr Fragen

Stefan Schwarzer s.schwarzer at ndh.net
Sun Apr 28 18:04:43 EDT 2002


Hallo Gerhard

Gerhard Häring wrote:
> > 2. Ich habe mir die Doku zum Modul threading durchgelesen, aber habe
> > noch kein so rechtes Gefühl dafür, für welchen Zweck ich welche Klasse
> > (Lock, RLock, Semaphore, Condition, Event) verwende. Irgendwie sind mir
> > die Beschreibungen im Moment zu abstrakt, obwohl ich sonst mit
> > abstrakten Beschreibungen ganz gut zurechtkomme.
> >
> > Kann mir jemand Tipps geben, was ich lesen/anschauen kann, um mit den
> > Konzepten vertrauter zu werden? Meine Suche mit Google (Web und Groups)
> > war nicht so ergiebig.
> 
> Ich habe gehört, dass es von Aahz ein Tutorial geben soll. Was ich da
> gesehen habe, ist aber mehr als mager.

ja, das hatte ich auch gefunden und teile deine Meinung.

> Evtl. ist das in einem Buch ganz
> gut beschrieben. Als ich das letzte Mal im Laden Python-Bücher gewälzt
> habe, hatten mir die von Lundh und Beazley echt gut gefallen. Vielleicht
> steht ja bei Amazon o. ä. ein Inhaltsverzeichnis.

Die Inhaltsverzeichnisse (ich habe nur welche ohne Seitenzahlen gefunden)
sagen wenig aus, wenn nur dort bspw. nur "Multithreading" und
"Multithreading in Python" drinsteht. ;-) Ich versuche mal bei nächster
Gelegenheit, das eine oder andere Buch zum Anschauen in die Finger zu
bekommen.

> > 3. Ein konkretes Beispiel, mit dem ich mich gerade auseinandersetze,
> > ist dieses: Ich habe einen Teil Initialisierungscode, der nur einmal
> > ausgeführt werden soll, genauer, vom ersten Thread, der den Code erreicht.
> >
> > Im Moment ist das etwa so implementiert, wobei eine Instanz der Klasse
> > Example von mehreren Threads verwendet werden kann.
> >
> > class Example:
> >     def __init__(self):
> >         self._is_worked_on_or_ready = False
> >         self._is_ready = False
> >         self._data = ...
> >
> >     def _init_structure(self):
> >         if self._is_worked_on_or_ready:
> >             return
> >         else:
> >             self._is_worked_on_or_ready = True
> >         # init self._data
> >         ...
> >         self._is_ready = True
> >
> >     def use_structure(self, id):
> >         # this code might be called concurrently
> >         while not self._is_ready:
> >             self._init_structure()
> 
> :-)) Genau darum wurden die Konstruktionen, wie man sie in threading
> sieht, erfunden. Deine while-Schleife verbrät absolut unnötig
> Rechenzeit.

Um die Rechenzeit ist es nicht so schade. Wenn die Datenstruktur bereits
initialisiert ist, wird der Rumpf gar nicht ausgeführt. Und solange die
Initialisierung der Struktur nicht abgeschlossen ist, kann use_structure
ohnehin nichts damit anfangen und muss warten.

Es sei denn, ich mache hier einen Denkfehler. ;o)

> Abgesehen davon kann es leicht sein, dass der Code deswegen
> auch noch Bugs enthält. Das kann ich aber nicht beurteilen.

Mir ist mittlerweile aufgefallen, dass es eine Race-Condition geben könnte,
wenn ein anderer Thread die if-Bedingung in _init_structure erreicht,
bevor ein vorher "angekommener" Thread die Statusvariable im else-Zweig
auf True setzt. Im konkreten Fall würde das außer einer doppelten
Initialisierung aber wohl nicht stören, da beide Durchläufe dieselben
Werte in der Datenstruktur setzen würden.

> Schau dir mal threading.Condition an, das scheint hier genau das
> richtige zu sein.

Ja, habe ich gerade mal gemacht, sieht in der Tat nicht schlecht aus. :-)
Ich probiere es vermutlich morgen oder übermorgen aus.

Danke und viele Grüße
 Stefan



More information about the Python-de mailing list