繁体   English   中英

python的线程模块中condition.notify()的意义是什么?

[英]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. 当我从两个类中删除notify()语句时,我的程序在 for 循环的几次迭代中运行得很好(即生产者推送项目和消费者弹出项目),然后在某些时候生产者在没有消费者的情况下继续将项目推送到队列运行时,队列已满,但消费者再也不会运行,程序只是暂停。 似乎对这个程序的性能至关重要的notify()有什么意义?

非常感谢您的帮助:)

1) 它向等待锁释放的线程发出信号,它可以继续执行。

2) Condition.notify(n)从内部队列中最多占用n线程,并在它们等待的锁上调用release - 从而唤醒它们。 如果内部队列为空,则没有人唤醒, notify调用无效。 这就是为什么从一开始,移除notify就没有任何效果,但是一旦消费者线程调用了wait ,就没有人来唤醒他们,他们一直在等待。

TL; 博士

  1. 在这里醒来可以被看作是将生产者或消费者从睡眠中唤醒,并通知他们一旦他们的共享 PPE(底层锁)可用,他们就可以重新开始工作。

  2. 消费者看到队列何时为空,然后进入睡眠状态,等待生产者在添加到队列时将其唤醒。

    但是你已经剥夺了生产者唤醒消费者的能力。

    生产者看到队列已满,然后进入睡眠状态,等待消费者从队列中取出时将其唤醒。

    但是你已经剥夺了消费者唤醒生产者的能力。

    而现在他们都睡着了。


适当的讨论

理解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()被通知它可以恢复生产(一旦它可以获取底层锁)
  • Consumer在等待Producer唤醒,Producer在等待Consumer唤醒
  • 僵持!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM