gpt4 book ai didi

Python线程锁是condition.acquire 类似于lock.acquire

转载 作者:行者123 更新时间:2023-11-28 22:19:44 34 4
gpt4 key购买 nike

condition.acquire(threading.Condition()) 是否类似于lock.acquire(threading.Lock)。两者都可以访问锁吗?我可以使用condition.wait,用lock.acquire通知还是我必须使用condition.wait,用condition.acquire通知。

cond.acquire()  // can i replace with lock.acquire

while count[ipID]> 1:
cond.wait()
if ipID == 0:
time.sleep(10)


count[ipID] = count[ipID] + 1


cond.release() // can i replace with lock.release

最佳答案

如果您的条件是这样创建的:

lock = Lock()
cond = Condition(lock)

…那么是的,如 the docs解释一下,cond.acquire()只是调用lock.acquire(),所以你可以这样做并获得相同的效果。对于发布也是如此。但是,它可能会误导人类读者(或许还有静态分析工具),因此除非您有充分的理由,否则您不应该这样做。


另一方面,如果它们是不相关的对象,则创建如下:

lock = Lock()
cond = Condition()

...那么不行。如果您尚未获取条件使用的锁,则调用 cond.wait() 是非法的。它肯定会引发 RuntimeError。如果其他 Lock 对象碰巧确保没有其他人可以访问 cond,这并不重要; cond.wait 的全部要点在于,它以原子方式释放其锁并在 notify 上阻塞,因此如果它不持有其锁,则作为条件是无用的。


顺便说一句,同时获取 LockCondition in a with statement 几乎总是更好。 :

with cond:
with count[ipID] > 1:
cond.wait()
if ipID == 0:
time.sleep(10)
count[ipID] = count[ipID] + 1

按照您编写的方式,如果 acquire 之后发生任何事情引发异常,您将永远不会释放该条件,因此等待它的其他线程都无法唤醒。

当我们讨论这个问题时,使用sleep几乎总是线程设计有问题的迹象。为什么不能直接 wait(timeout=10) 来代替呢?如果您有太多虚假的 notify 调用,您应该修复它。如果 count[ipID] 未正确重置,因此 while 循环可能会提前退出,那么修复这一点就更为重要。无论您认为通过 sleep 解决了什么问题,您可能只是在掩饰它。

关于Python线程锁是condition.acquire 类似于lock.acquire,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49505703/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com