首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >condition.notify()在python的线程处理模块中的意义是什么?

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

Stack Overflow用户
提问于 2017-09-20 18:16:38
回答 2查看 1.3K关注 0票数 0

所以我从线程模块中使用python的条件:

代码语言:javascript
复制
from threading import Thread, Condition
condition = Condition()

我有一个生产者类(Thread的子类),它本质上在for循环中将项添加到队列中,直到队列满(即达到定义的最大长度)和使用者类,除非队列是空的,否则在for循环中会弹出项。在生产者中,如果队列已满,则有一个condition.wait()语句,类似地,在使用者类中,如果队列为空,则有一个condition.wait()语句。如果这些条件都没有满足(队列既不满也不空),那么每个类都会执行它的任务(分别为生产者或消费者向队列添加一个项目或弹出一个项目),然后在释放条件( condition.release())之前,我们有一个condition.notify()语句。我从文档中读到,通知()唤醒了等待的线程之一。

我现在的问题是两倍:

  1. “醒来”对线程到底意味着什么?
  2. 当我从两个类中删除通知()语句时,我的程序在很少的for循环迭代(即生产者推送项和使用者pops项)中运行得很好,然后生产者在没有消费者运行的情况下一直将项目推送到队列中,队列就满了,但是使用者再也不运行了,程序就会停止运行。通知()对于这个程序的性能来说有什么重要意义。

非常感谢你的帮助:)

EN

回答 2

Stack Overflow用户

发布于 2018-08-06 08:28:56

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

2) Condition.notify(n)从内部队列获取n线程,并在等待的锁上调用release --从而唤醒它们。如果内部队列为空,则没有人要唤醒,notify调用也不起作用。这就是为什么从一开始,删除notify就没有效果,但是一旦用户线程调用了wait,就没有人唤醒它们了,它们一直在等待。

票数 0
EN

Stack Overflow用户

发布于 2020-06-25 11:14:01

TL;DR

  1. 在这里醒来可以被看作是唤醒生产者或消费者从睡眠告诉他们,他们可以回到工作,只要他们的共享个人防护(底层锁)是可用的。
  2. 消费者看到队列空了,就睡着了,等待生产者在队列中添加时唤醒它。 但是你剥夺了制片人唤醒消费者的能力。 生产者看到队列满了,就睡着了,等待消费者从队列中唤醒它。 但是你剥夺了消费者唤醒生产者的能力。 现在他们都睡着了。

讨论恰当

理解Condition.notify()的重要性的关键在于认识到,当您在一个条件下运行wait()时,您不是在等待它的底层锁变得可用,而是在等待在该条件下的某个通知或超时。

根据threading.Condition.wait上的Python

等待(timeout=None)等待直到通知或直到超时发生.

当您在一个条件下调用notify时,您实际上是在通知n个线程,这些线程在该条件对象上调用了wait,只要它们能够获得底层锁,它们就可以停止等待

这可以从threading.Condition.notify上的Python推断出来。

通知(n=1)注意:唤醒的线程在重新获得锁之前实际上不会从其wait()调用返回。由于通知()不释放锁,其调用方应该。

现在,下面是我对您的代码发生了什么情况的有教养的猜测:

  • 生产者将多个项目推入队列。
  • 使用者使用队列中的许多项。
  • 排队很快就会空无一人。
  • 消费者wait()将被通知,它可能会恢复消费(一旦它可以获得基础锁)
  • 生产者将项目推入队列。
  • 生产者永远不会到达notify()消费者,因为它可能会恢复消费。
  • 排队很快就满了。
  • 生产者wait()的通知,它可以恢复生产(一旦它可以获得基础锁)
  • 消费者等待生产者唤醒,生产者等待消费者唤醒。
  • 相持!
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46329131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档