采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师您好, notify方法的源码中直接释放锁,执行完notify方法后,不是应该直接执行xiaoai的代码段了吗?为何tianmao的wait方法执行后才会执行xiaoai的代码段呢? print(“小爱同学”) self.cond.notify() self.cond.wait()
你可以这样理解, condition只有的wait只有通过condition的notify才能唤醒,所以xiaoai只有通过天猫的notify之后才能启动
老师,您说的这个我是明白的,我的疑惑是,当前线程在调用notify方法后,自身线程会被阻塞或者说停止吗?因为唤醒了其他的线程,这个唤醒的动作,源码里面是直接release锁,但是我在当前线程wait方法前加了print测试的时候发现,在执行了唤醒后,也执行了wait前面的print,对于这个表示不解。
执行notify之后的逻辑是否会执行 其实最好的验证方法就是自己写代码测试一下
import threadingfrom threading import Conditionclass XiaoAi(threading.Thread): def __init__(self, cond): super().__init__(name="小爱") self.cond = cond def run(self): with self.cond: self.cond.wait() print("在呢") self.cond.notify() self.cond.wait() print("好的") self.cond.notify() self.cond.wait() print("近看还是一头猪") self.cond.notify()class TianMao(threading.Thread): def __init__(self, cond): super().__init__(name="天猫精灵") self.cond = cond def run(self): with self.cond: print("小爱同学") self.cond.notify() self.cond.wait() print("我们来对古诗吧") self.cond.notify() self.cond.wait() print("远看一头猪") self.cond.notify() self.cond.wait()if __name__ == '__main__': # condition有两层锁,一把地层锁,会在线程调用了wait的时候进行释放,上面的锁,会在每次调用wait的时候分配一把,并放到condition的等待队列中,等待notify方法的唤醒 cond = Condition() xiao_ai = XiaoAi(cond) tian_mao = TianMao(cond) xiao_ai.start() tian_mao.start()
你发一下完整的代码 我看看
import threading from threading import Condition class XiaoAi(threading.Thread): def __init__(self, cond): super().__init__(name="小爱") self.cond = cond def run(self): with self.cond: self.cond.wait() print("在呢") self.cond.notify() self.cond.wait() print("好的") self.cond.notify() self.cond.wait() print("近看还是一头猪") self.cond.notify() class TianMao(threading.Thread): def __init__(self, cond): super().__init__(name="天猫精灵") self.cond = cond def run(self): with self.cond: print("小爱同学") self.cond.notify() self.cond.wait() print("我们来对古诗吧") self.cond.notify() self.cond.wait() print("远看一头猪") self.cond.notify() self.cond.wait() if __name__ == '__main__': # condition有两层锁,一把地层锁,会在线程调用了wait的时候进行释放,上面的锁,会在每次调用wait的时候分配一把,并放到condition的等待队列中,等待notify方法的唤醒 cond = Condition() xiao_ai = XiaoAi(cond) tian_mao = TianMao(cond) xiao_ai.start() tian_mao.start()
登录后可查看更多问答,登录/注册
socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO
1.2k 31
1.1k 24
1.0k 16
1.4k 10
1.1k 9