带有'with'语句的非阻塞锁

Jae*_*LEE 7 python multithreading locking

据我所知,如果lock已被另一个线程获取,将阻止以下代码.

似乎非阻塞可以通过实现lock.acquire(0),但我必须使用try-finally块代替with块.

lock = threading.Lock()

def func():
 with lock:
  # do something...
Run Code Online (Sandbox Code Playgroud)

有没有任何方法可以实现非阻塞锁定获取?

jfs*_*jfs 8

有没有任何方法可以实现非阻塞锁定获取?

是.如果无法立即获取锁定,只需引发异常即可.就像是:

@contextlib.contextmanager
def non_blocking_lock(lock=threading.Lock()):
    if not lock.acquire(blocking=False):
        raise WouldBlockError
    try:
        yield lock
    finally:
        lock.release()
Run Code Online (Sandbox Code Playgroud)

用法:

with non_blocking_lock():
    # run with the lock acquired
Run Code Online (Sandbox Code Playgroud)


小智 6

@contextmanager
def nonblocking(lock):
    locked = lock.acquire(False)
    try:
        yield locked
    finally:
        if locked:
            lock.release()

lock = threading.Lock()
with nonblocking(lock) as locked:
    if locked:
        do_stuff()
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到堆栈溢出!虽然此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的附加上下文可以提高其长期价值。不鼓励仅使用代码的答案。 (2认同)