import threading import signal import time TIMEOUT = 1.0 nsignals = 0 def burn_cpu(): for i in range(10**3 * 3): pass def sighandler(signum, frame): global nsignals nsignals += 1 burn_cpu() lock = threading.Lock() lock.acquire() start_time = time.monotonic() old_handler = signal.signal(signal.SIGALRM, sighandler) signal.setitimer(signal.ITIMER_REAL, 0.001, 0.001) res = lock.acquire(timeout=TIMEOUT) signal.setitimer(signal.ITIMER_REAL, 0, 0) signal.signal(signal.SIGALRM, old_handler) dt = time.monotonic() - start_time print("acquire(timeout=%.1f) took %.1f seconds and got %s signals" % (TIMEOUT, dt, nsignals)) lock.release()