![](/img/trans.png)
[英]Python multiprocessing deadlock when calling Condition.notify() before the other process is ready
[英]What is the significance of condition.notify() in python's threading module?
所以我从线程模块使用 python 的条件:
from threading import Thread, Condition
condition = Condition()
我有一个 Producer 类(Thread 的子类),它基本上在 for 循环中将项目添加到队列中,直到队列已满(即达到定义的最大长度)和一个 Consumer 类,它在 for 循环中弹出项目,除非队列为空. 在生产者中,如果队列已满,我们有一个condition.wait()语句,同样在消费者类中,如果队列为空,我们有一个 condition.wait()语句。 如果这两个条件都不满足(队列既不满也不空)每个类做它的事情(分别为生产者或消费者向队列添加一个项目或弹出一个项目)然后在释放条件之前( condition.release() ) ,我们有一个condition.notify()语句。 我从文档中读到 notify() 唤醒等待的线程之一。
我现在的问题有两个方面:
非常感谢您的帮助:)
1) 它向等待锁释放的线程发出信号,它可以继续执行。
2) Condition.notify(n)
从内部队列中最多占用n
线程,并在它们等待的锁上调用release
- 从而唤醒它们。 如果内部队列为空,则没有人唤醒, notify
调用无效。 这就是为什么从一开始,移除notify
就没有任何效果,但是一旦消费者线程调用了wait
,就没有人来唤醒他们,他们一直在等待。
在这里醒来可以被看作是将生产者或消费者从睡眠中唤醒,并通知他们一旦他们的共享 PPE(底层锁)可用,他们就可以重新开始工作。
消费者看到队列何时为空,然后进入睡眠状态,等待生产者在添加到队列时将其唤醒。
但是你已经剥夺了生产者唤醒消费者的能力。
生产者看到队列已满,然后进入睡眠状态,等待消费者从队列中取出时将其唤醒。
但是你已经剥夺了消费者唤醒生产者的能力。
而现在他们都睡着了。
理解Condition.notify()
重要性的关键在于意识到当您在条件上wait()
,您不是在等待其底层锁可用,而是在等待一些通知或在该条件下超时。
根据关于 threading.Condition.wait 的 Python 文档
wait(timeout=None) Wait until notified or until a timeout occurs...
当您在某个条件上调用notify
时,您实际上是在通知 n 个调用该条件对象上的wait
线程,它们可能会在获取底层 lock 后立即停止等待。
这可以从关于 threading.Condition.notify 的 Python 文档中推断出来
notify(n=1) ... Note: an awakened thread does not actually return from its wait() call until it can reacquire the lock. Since notify() does not release the lock, its caller should.
现在,这是我对您的代码发生的事情的有根据的猜测:
wait()
被通知它可以恢复消费(一旦它可以获取底层锁)notify()
消费者它可能会恢复消费。wait()
被通知它可以恢复生产(一旦它可以获取底层锁)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.