我有以下“消费者”代码:
....
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/