详细阐述史蒂文的评论建议:
import threadingimport timelock = threading.Lock()cond = threading.Condition(threading.Lock())def waitLock(timeout): with cond: current_time = start_time = time.time() while current_time < start_time + timeout: if lock.acquire(False): return True else: cond.wait(timeout - current_time + start_time) current_time = time.time() return False
注意事项:
- 有两个
threading.Lock()
对象,一个在内部threading.Condition()
。 - 操作时
cond
,获取了锁;wait()
但是,该操作将其解锁,因此任何数量的线程都可以观看它。 - 等待被嵌入到for循环中,以跟踪时间。
threading.Condition
可能会因为超时以外的其他原因而收到通知,因此,如果您确实希望时间到期,则仍然需要跟踪时间。 - 即使有条件,您仍然可以“轮询”真正的锁,因为它可能会唤醒多个线程并争夺该锁。如果lock.acquire失败,则循环返回等待状态。
- 此
waitLock
函数的调用者应lock.release()
在acond.notify()
后面加上a,以便通知正在等待该函数的其他线程重试获取该锁。该示例中未显示。



