◐ Shell
clean mode source ↗

Message 132515 - Python tracker

The acquire() and release() functions of threading.Semaphore do not make use of the try...finally suite as it would be reasonable.
They just do 

    def acquire(self, blocking=1):
        rc = False
        self.__cond.acquire()
        [...]
        self.__cond.release()
        return rc

    [...]

    def release(self):
        self.__cond.acquire()
        [...]
        self.__cond.release()

while IMO it would be appropriate to put a try: after the acquire() calls and a finally: before the release() calls so the lock is not held forever if an exception occurs.

(Feel free to use with self.__cond: instead...)

Especially when Ctrl-C is pressed while acquire() waits, the respective KeyboardInterrupt gets thrown after acquire(), breaking the respective function and the __cond is locked forever because it is never release()d.