安徽建设厅官方网站,响应式网站设计思路,福建网站建设费用,英文网站建设详细方案文章首发微信公众号#xff0c;微信搜索#xff1a;猿说python对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – 线程条件变量Condition.一.线程条件变量Condition相关函数介绍acquire() — 线程…文章首发微信公众号微信搜索猿说python对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – 线程条件变量Condition.一.线程条件变量Condition相关函数介绍acquire() — 线程锁注意线程条件变量Condition中的所有相关函数使用必须在acquire() /release() 内部操作release() — 释放锁注意线程条件变量Condition中的所有相关函数使用必须在acquire() /release() 内部操作wait(timeout) — 线程挂起(阻塞状态)直到收到一个notify通知或者超时才会被唤醒继续运行超时参数默认不设置可选填类型是浮点数单位是秒。wait()必须在已获得Lock前提下才能调用否则会触发RuntimeErrornotify(n1) — 通知其他线程那些挂起的线程接到这个通知之后会开始运行缺省参数默认是通知一个正等待通知的线程,最多则唤醒n个等待的线程。notify()必须在已获得Lock前提下才能调用否则会触发RuntimeErrornotify()不会主动释放LocknotifyAll() — 如果wait状态线程比较多notifyAll的作用就是通知所有线程二.线程条件变量Condition原理在前面的文章已经介绍过互斥锁主要作用是并行访问共享资源时保护共享资源防止出现脏数据。python 条件变量Condition也需要关联互斥锁同时Condition自身提供了wait/notify/notifyAll方法用于阻塞/通知其他并行线程可以访问共享资源了。可以这么理解Condition提供了一种多线程通信机制假如线程1需要数据那么线程1就阻塞等待这时线程2就去制造数据线程2制造好数据后通知线程1可以去取数据了然后线程1去获取数据。三.线程条件变量Condition使用案例一成语接龙# !usr/bin/env python
# -*- coding:utf-8 _*-Author:何以解忧
Blog(个人博客地址): shuopython.com
WeChat Official Account(微信公众号)猿说python
Github:www.github.comFile:python_.py
Time:2019/10/21 21:25Motto:不积跬步无以至千里不积小流无以成江海程序人生的精彩需要坚持不懈地积累
# 导入线程模块
import threading# 创建条件变量condition
con threading.Condition()def thread_one(name):# 条件变量condition 线程上锁con.acquire()print({}:成语接龙准备好了吗.format(name))# 唤醒正在等待(wait)的线程con.notify()# 等待对方回应消息使用wait阻塞线程等待对方通过notify唤醒本线程con.wait()print({}:一干二净.format(name))# 唤醒对方con.notify()# 等待消息答应con.wait()print({}:一天就知道看抖音美女给你来个简单点的来了毛手毛脚.format(name))# 唤醒对方con.notify()# 等待消息答应con.wait()print({}:哟哟哟不错不错.format(name))# 唤醒对方con.notify()# 条件变量condition 线程释放锁con.release()def thread_two(name):# 条件变量condition 线程上锁con.acquire()# wait阻塞状态等待其他线程通过notify唤醒本线程con.wait()print({}:准备好了~开始吧.format(name))# 唤醒对方con.notify()# 等待消息答应con.wait()print({}:净你妹啊没法接...来个简单点的....format(name))# 唤醒对方con.notify()# 等待消息答应con.wait()print({}:嘿,这个我知道脚踏实地.format(name))# 唤醒对方con.notify()con.release()if __name__ __main__:# 创建并初始化线程t1 threading.Thread(targetthread_one,args(A))t2 threading.Thread(targetthread_two,args(B))# 启动线程 -- 注意线程启动顺序启动顺序很重要t2.start()t1.start()# 阻塞主线程等待子线程结束t1.join()t2.join()print(程序结束)输出结果A:成语接龙准备好了吗
B:准备好了~开始吧
A:一干二净
B:净你妹啊没法接...来个简单点的...
A:一天就知道看抖音美女给你来个简单点的来了毛手毛脚
B:嘿,这个我知道脚踏实地
A:哟哟哟不错不错
程序结束案例二生产者与消费者模式以吃火锅为例一盘老肉片有10块肉吃完了又重新往锅里加….生产者往锅里加老肉片每次加一盘(10块)消费者吃煮熟的肉片没吃一片肉片数量减一吃完为止;# 导入线程模块
import threading
import time# 创建条件变量condition
con threading.Condition()
meat_num 0def thread_consumers():# 条件变量condition 线程上锁con.acquire()# 全局变量声明关键字 globalglobal meat_nummeat_num 0# 等待肉片下锅煮熟con.wait()while True:print(我来一块肉片...)meat_num - 1print(剩余肉片数量%d%meat_num)time.sleep(0.5)if meat_num 0:# 肉片吃光了通知老板添加肉片print(老板再来一份老肉片...)con.notify()# 肉片吃光了等待肉片con.wait()# 条件变量condition 线程释放锁con.release()def thread_producer():# 条件变量condition 线程上锁con.acquire()# 全局变量声明关键字 globalglobal meat_num# 肉片熟了可以开始吃了meat_num 10print(肉片熟了可以开始吃了...)con.notify()while True:# 阻塞函数,等待肉片吃完的通知con.wait()meat_num 10# 添加肉片完成可以继续开吃print(添加肉片成功当前肉片数量%d%meat_num)time.sleep(1)con.notify()con.release()if __name__ __main__:# 创建并初始化线程t1 threading.Thread(targetthread_producer)t2 threading.Thread(targetthread_consumers)# 启动线程 -- 注意线程启动顺序启动顺序很重要t2.start()t1.start()# 阻塞主线程等待子线程结束t1.join()t2.join()print(程序结束)输出结果肉片熟了可以开始吃了...
我来一块肉片...
剩余肉片数量9
我来一块肉片...
剩余肉片数量8
我来一块肉片...
剩余肉片数量7
我来一块肉片...
剩余肉片数量6
我来一块肉片...
剩余肉片数量5
我来一块肉片...
剩余肉片数量4
我来一块肉片...
剩余肉片数量3
我来一块肉片...
剩余肉片数量2
我来一块肉片...
剩余肉片数量1
我来一块肉片...
剩余肉片数量0
老板再来一份老肉片...
添加肉片成功当前肉片数量10
我来一块肉片...
剩余肉片数量9
我来一块肉片...
剩余肉片数量8
我来一块肉片...
剩余肉片数量7
.............注意:1.全局变量要声明关键字 global2.注意线程的启动顺序这个很重要四.重点总结注意线程互斥锁Lock/线程事件Event/线程条件变量Condition三者的区别场景不同使用方式也不同前两者一般可以作为简单的线程交互线程条件变量Condition可以用于比较复杂的线程交互猜你喜欢:1.python线程创建和参数传递2.python线程互斥锁Lock3.python线程事件Event4.python return逻辑判断表达式转载请注明猿说Python » python条件变量Condition想了解更多python内容请直接搜索微信公众号猿说pythonPython教程 - 猿说Pythonwww.shuopython.com本人也还在学习python中博客会持续更新ing有兴趣的小伙伴关注走一波推荐浏览个人博客网站猿说python文章采用树状分类结构目录清晰一点文章内容有问题的话欢迎给出建议或者直接留言.