[Python-de] threads - noch mehr Fragen

Stefan Schwarzer s.schwarzer at ndh.net
Sun Apr 28 03:31:01 EDT 2002


Hallo,

ich habe auch gerade angefangen, mich intensiver mit Multithreading in
Python auseinanderzusetzen und habe auch ein paar Fragen.

1. Gibt es eine Möglichkeit, in einem Code-Teil die Id des gerade
aktiven Threads zu ermitteln? Also in etwa

import threading

def test():
    # Gibt es eine solche Funktion wie current_thread_id?
    print "I'm in thread %s" % current_thread_id()

thread1 = threading.Thread(test)
thread2 = threading.Thread(test)

thread1.start()
thread2.start()

Ausgabe bspw.:
815
4711

Ich habe in der Library-Dokumentation leider nichts entsprechendes
gefunden.

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.

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()
        # do something with self._data
        ...
        return ...

Wenn mich nicht alles täuscht, müsste das funktionieren. Andererseits
würde es mich wundern, wenn es nicht einfacher ginge. Hat jemand einen
Rat?

(Anmerkung: Die nahe liegende Möglichkeit, den nur einmal auszuführenden
Code in einem Modul beim Importieren ausführen zu lassen, ist in meinem
Fall nicht anwendbar, da ich mir dabei einen rekursiven Import einhandle.
Das hält mich auch davon ab, die Initialierung im Konstruktor aufzurufen.)

Vielen Dank schonmal für eure Hinweise. :-)

Stefan



More information about the Python-de mailing list