Python是否提供as_completed函数以等待多锁中最早释放的锁?
等待任意一个Lock释放的实现方案
Python标准库中没有直接提供针对threading.Lock的as_completed函数——concurrent.futures.as_completed是专门用来处理Future对象的,无法直接作用于Lock这类线程同步原语。
要实现“等待任意一个锁可用(即被释放)”的需求,可以借助线程池+concurrent.futures.as_completed间接实现,核心思路是把每个锁的acquire操作放到独立线程中,通过监听线程任务的完成状态来获取第一个可用的锁:
from threading import Lock from concurrent.futures import ThreadPoolExecutor, as_completed def wait_for_lock(lock: Lock): # 阻塞直到锁可用,获取后返回该锁 lock.acquire() return lock def f(a: Lock, b: Lock): with ThreadPoolExecutor(max_workers=2) as executor: # 提交两个等待锁的任务 futures = [executor.submit(wait_for_lock, lock) for lock in [a, b]] # 遍历第一个完成的任务 for future in as_completed(futures): acquired_lock = future.result() try: # 这里编写获取到锁后的业务逻辑 print(f"成功获取到锁: {acquired_lock}") # ... 你的代码逻辑 finally: # 务必释放锁,避免死锁 acquired_lock.release() # 取消剩余未完成的任务,避免不必要的阻塞 for remaining_future in futures: if remaining_future != future: remaining_future.cancel() break
补充说明
如果你的场景是“等待锁被持有它的线程主动释放”(而非自己去获取锁),那么Lock本身没有内置的释放通知机制,这时候需要结合threading.Event来扩展:让持有锁的线程在释放锁时触发对应的Event,然后通过等待任意一个Event的触发来实现需求。
内容的提问来源于stack exchange,提问作者Daniel Chin
相关产品推荐
相关产品推荐

