今天,玩锁,我注意到以下情况。假设我有以下需要锁定的代码。使用旧方式获取和释放:
lock=Lock()
lock.acquire()
a=foo()
if condition:
doSomething()
lock.release()
else:
lock.release()
doSomethingElse()
这段代码无法使用with
构造实现:
lock=Lock()
with lock:
a=foo()
if condition:
doSomething()
else: #This is wrong grammar here.
doSomethingElse()
或者可以吗?如果我错了,请纠正我。
答案 0 :(得分:2)
那不是'用'是为了。它的存在是为了保证无论如何都会调用release
函数。
如果您想有条件地拨打release
,请不要使用with
。使用with
可能有更好的替代代码,但如果没有看到完整的上下文,就无法知道。
关于您的新代码,IMO最好的选择是:
with Lock(): # no need for the lock name
a=foo()
# c is used just in case your condition is a complex expression with side effects
c = condition
if c:
doSomething()
if not c:
doSomethingElse()
现在锁的范围很明显。如果您想添加try/catch
或其他几个函数调用,则不会混淆是否保持锁定。
答案 1 :(得分:0)
如果Lock
类正确实现了__enter__
和__exit__
方法,您可以按如下方式使用它:
with Lock() as lock:
a=foo()
if condition:
doSomething()
else:
doSomethingElse()
如果您想要dosomethingElse()
,如果没有锁定,那么这就是代码:
if condition:
with Lock() as lock:
a = foo()
doSomething()
else:
doSomethingElse()