[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