给定此代码,我如何确保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 循环中添加超时,以防您不小心锁住自己。