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)
有没有任何方法可以实现非阻塞锁定获取?
有没有任何方法可以实现非阻塞锁定获取?
是.如果无法立即获取锁定,只需引发异常即可.就像是:
@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)
| 归档时间: |
|
| 查看次数: |
6481 次 |
| 最近记录: |