我有以下“消费者”代码:

    ....

    while 1:

        time.sleep(self.sleeptime)

        cond.acquire() #acquire the lock
        print currentThread(), "lock acquired"

        while itemq.isEmpty():
            cond.wait()

        itemq.consume()
        print currentThread(),"Consumed One Item"
        cond.release()

以及以下生产者的代码:
....
while 1 :


           cond.acquire() #acquire the lock
           print currentThread(), "lock acquired"
           print currentThread(),"Produced One Item"
           itemq.produce()
           cond.notifyAll()
           cond.release()

           time.sleep(self.sleeptime)

我正在与 1 个生产者和 2 个消费者一起运行该程序。
我不知道期待什么结果。生产者调用“notifyAll()”,所以我希望两个消费者都能从他们的“等待”中醒来。我看到确实两个消费者都获得了锁,但只有第一个获得锁的人才能真正使用该项目。有人可以告诉我“等待”命令是如何工作的吗?如果两个线程都得到了“notifyAll”,那么怎么只有一个线程可以消费?

谢谢,

最佳答案

关键在等待的循环中:

while itemq.isEmpty():
        cond.wait()

cond.wait() 是这样实现的(仅示例):
def wait():
    cond.release()
    wait for notify
    cond.aquire()

因此,由于锁定,一次只有一个消费者退出“等待”功能。第一个退出等待函数的消费者检测到 itemq.isEmpty() == false 并继续消费该项目。然后他们重新进入等待函数并释放锁。

第二个消费者退出,再次检测到 itemq.isEmpty() == true,并立即重新进入 wait()。

关于python 线程 - "condition.wait"和 "condition.notifyAll"如何工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3737755/

10-11 04:54