另一个 Python 线程怎么能等到锁被释放?



给定此代码,我如何确保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它,可以成为一个解决方案。

我在许多函数上使用线程锁进行异步用户输入,并希望一些更可重用的东西,其中用户输入不会被错过,因为锁恰好在该实例被锁定。所以我把检查锁捆绑到一个包装器中,并附有一点等待循环;

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 循环中添加超时,以防您不小心锁住自己。

最新更新