You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:40:29