所以我从线程模块中使用python的条件:
from threading import Thread, Condition
condition = Condition()我有一个生产者类(Thread的子类),它本质上在for循环中将项添加到队列中,直到队列满(即达到定义的最大长度)和使用者类,除非队列是空的,否则在for循环中会弹出项。在生产者中,如果队列已满,则有一个condition.wait()语句,类似地,在使用者类中,如果队列为空,则有一个condition.wait()语句。如果这些条件都没有满足(队列既不满也不空),那么每个类都会执行它的任务(分别为生产者或消费者向队列添加一个项目或弹出一个项目),然后在释放条件( condition.release())之前,我们有一个condition.notify()语句。我从文档中读到,通知()唤醒了等待的线程之一。
我现在的问题是两倍:
非常感谢你的帮助:)
发布于 2018-08-06 08:28:56
1)它向等待释放锁的线程发出信号--它可以继续执行。
2) Condition.notify(n)从内部队列获取n线程,并在等待的锁上调用release --从而唤醒它们。如果内部队列为空,则没有人要唤醒,notify调用也不起作用。这就是为什么从一开始,删除notify就没有效果,但是一旦用户线程调用了wait,就没有人唤醒它们了,它们一直在等待。
发布于 2020-06-25 11:14:01
TL;DR
讨论恰当
理解Condition.notify()的重要性的关键在于认识到,当您在一个条件下运行wait()时,您不是在等待它的底层锁变得可用,而是在等待在该条件下的某个通知或超时。
根据threading.Condition.wait上的Python
等待(timeout=None)等待直到通知或直到超时发生.
当您在一个条件下调用notify时,您实际上是在通知n个线程,这些线程在该条件对象上调用了wait,只要它们能够获得底层锁,它们就可以停止等待。
这可以从threading.Condition.notify上的Python推断出来。
通知(n=1)注意:唤醒的线程在重新获得锁之前实际上不会从其wait()调用返回。由于通知()不释放锁,其调用方应该。
现在,下面是我对您的代码发生了什么情况的有教养的猜测:
wait()将被通知,它可能会恢复消费(一旦它可以获得基础锁)notify()消费者,因为它可能会恢复消费。wait()的通知,它可以恢复生产(一旦它可以获得基础锁)https://stackoverflow.com/questions/46329131
复制相似问题