-1

今天玩锁,注意到以下情况。假设我有以下需要锁定的代码。使用获取和释放的旧方式:

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()   

或者可以吗?如果我错了,请纠正我。

4

2 回答 2

2

这不是'with'的用途。它的存在是为了保证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或其他几个函数调用,则不会混淆是否持有锁。

于 2014-10-09T06:31:02.600 回答
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()
于 2014-10-09T06:34:34.537 回答