Python线程锁是条件.获取类似锁定.acqui

2024-09-27 07:25:02 发布

您现在位置:Python中文网/ 问答频道 /正文

是条件.获取(螺纹。条件())类似于锁定.获取(穿线。锁定). 是否两者都能进入锁。我能用吗条件。等等,通知锁定.获取或者我必须使用条件。等等,通知条件.获取. 在

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

Tags: lockreleaseifcountwith条件canreplace
2条回答

如果你的病情是这样造成的:

lock = Lock()
cond = Condition(lock)

…那么是的,正如the docs解释的那样,cond.acquire()只是调用lock.acquire(),所以你可以这样做,得到同样的效果。{和}同样。然而,它很可能会误导人类读者(也可能是静态分析工具),所以除非你有一个很好的理由,否则你不应该这样做。在


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

^{pr2}$

…那就不行了。如果您没有获得条件使用的锁,则调用cond.wait()是非法的。它保证会引发RuntimeError。如果其他一些Lock对象碰巧确保没有人访问condcond.wait的全部意义在于它原子性地释放了notify上的锁和块,因此如果它没有持有它的锁,那么它作为一个条件是没有用的。在


顺便说一句,最好同时获得Locks和Conditionsin a ^{} statement

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

按照你写东西的方式,如果在这之后acquire引发了异常,你永远不会释放这个条件,所以其他等待它的线程都不能被唤醒。在

当我们这样做时,使用sleep几乎总是线程设计有问题的标志。你为什么不能改成{}?如果您有太多的假notify调用,您应该修复它。如果count[ipID]没有得到正确的重置,那么while循环可能会提前退出,那么修复这个问题就更重要了。不管你想用sleep解决什么问题,你可能只是在掩饰它。在

代码的通知部分如下。在

print "count is %d %s" % (count[ipID],name)

   cond.acquire()

   count[ipID] = count[ipID] - 1
   cond.notifyAll()
   cond.release()

相关问题 更多 >

    热门问题