另一个 Python 线程如何等待直到锁被释放?

How can another Python thread wait until a lock is released?

鉴于此代码,我如何确保 get_model() 无需等待就可以始终被调用,除非 reload_lock 处于活动状态?

最好,我不希望 get_model() 获取 reload_lock 本身,因为所有线程都可以自由调用此方法,除非应用程序正在重新加载它的模型。

import threading

reload_lock = threading.Lock()


def get_model(name):
    # Normally this can be called, unless reload_models() is active
    # e.g. "if reload_lock.locked() -> wait until lock is released.
    ...


def reload_models():
    try:
        reload_lock.acquire()
        ...  # reload models
    finally:
        reload_lock.release()

也许你应该这样尝试,在 get_model():

if reload_lock.locked():
    reload_lock.acquire()
    reload_lock.release()

我知道这是一个 acquire,但如果您立即 release 它可能是一个解决方案。

我在许多函数上使用线程锁来实现异步用户输入,并且想要更多一些东西 re-usable 用户输入不会丢失,因为锁恰好在那个实例上被锁定。所以我将检查锁捆绑到一个包装器中,并附加了一些等待循环;

import threading
from functool import wraps
from time import sleep

lock = threading.Lock()

def wait_lock(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        while lock.locked():
            sleep(0.001)
        lock.acquire()
        func(*args, **kwargs)
        lock.release()
    return wrapper

您还可以在 while 循环中添加超时,以防您不小心将自己线程锁定。