[python-users] Python2.5: Threading.py _Condition.wait()

hunniger do_not_reply_to_this_address at t-online.de
So Feb 18 14:18:54 CET 2007


Hallo zusammen,
Ich habe eine (sehr technische) Frage zu den Implementierungsdetails von 
Threading.py in Python 2.5 (möglicherweise bezüglich LinuxKernel 2.6 und 
der Native POSIX Thread Library).

Es gibt Condition Objekte in Python.
Mit einem Condition Objekt kann ein Thread sagen:

"Mein Leben hat keinen Sinn mehr solange eine bestimmte Bedingung nicht 
erfüllt ist"

Der Scheduler kann dann den Thread solange als tot ansehen bis die 
Bedingung erfüllt ist. Das kann die Systemleistung sehr verbessern, da 
solche Threads keine Rechenleistung mehr verbrauchen.

Praktisch wird ein Condition Objekt z.B. bei Queue.Queue() verwendet.

Die Implementierung von _Condition.wait() sieht vereinfacht so aus:

def wait(self):
  self.waiter = thread.allocate_lock()  # Create a new lock in "unlocked" state
  self.waiter.acquire() #  lock it 
  self.waiter.acquire() # block the current thread

def notify(self):
  self.waiter.release() # Allow the thread blocked in wait to go on


Ok, das geht natürlich so. Aber irgenwo sehe ich nicht wo wir dem 
Scheduler sagen, das wir auf eine Bedingung warten.  Wir verlangen ja 
nur ein gewöhliches Lock. Das Betriebssystem könnte nun fieserweise 
hingehen und uns ein Spinlock geben, womit wir dann Rechenleistung 
verbraten würden, bis der Scheduler durch einen TimerInterrupt 
aufgerufen wird und den Thread abwürgt. Dieses grausahme Spiel würde 
sich dann periodisch wiederholen, bis irgendjemand notify() aufruft.

Gruss Dirk



Mehr Informationen über die Mailingliste python-users