Python 线程条件变量 Condition - Python零基础入门教程

目录

  • 一.Python 线程条件变量 Condition 函数
  • 二.Python 线程条件变量 Condition 原理
  • 三.Python 线程条件变量 Condition 使用
  • 四.Python 线程条件变量 Condition 总结
  • 五.猜你喜欢

零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门

对于线程与线程之间的交互我们在前面的文章已经介绍了 Python 互斥锁 Lock / Python 事件 Event , 今天继续介绍一种线程交互方式 – 线程条件变量 Condition;

一.Python 线程条件变量 Condition 函数

  • acquire — 线程锁,注意线程条件变量 Condition 中的所有相关函数使用必须在acquire / release 内部操作;
  • release — 释放锁,注意线程条件变量 Condition 中的所有相关函数使用必须在acquire / release 内部操作;
  • **wait( timeout ) **— 线程挂起(阻塞状态),直到收到一个 notify 通知或者超时才会被唤醒继续运行(超时参数默认不设置,可选填,类型是浮点数,单位是秒)。wait 必须在已获得 Lock 前提下才能调用,否则会触发 RuntimeError;
  • **notify(n=1) **— 通知其他线程,那些挂起的线程接到这个通知之后会开始运行,缺省参数,默认是通知一个正等待通知的线程,最多则唤醒 n 个等待的线程。 notify 必须在已获得 Lock 前提下才能调用,否则会触发 RuntimeError ,notify 不会主动释放 Lock ;
  • notifyAll — 如果 wait 状态线程比较多,notifyAll 的作用就是通知所有线程;

二.Python 线程条件变量 Condition 原理

Python 互斥锁 Lock,主要作用是并行访问共享资源时,保护共享资源,防止出现脏数据。

Python 条件变量 Condition 也需要关联互斥锁,同时 Condition 自身提供了 wait / notify / notifyAll 方法,用于阻塞 / 通知其他并行线程,可以访问共享资源了。

可以这么理解,Condition 提供了一种多线程通信机制,假如线程 1 需要数据,那么线程 1 就阻塞等待,这时线程 2 就去制造数据,线程 2 制造好数据后,通知线程 1 可以去取数据了,然后线程 1 去获取数据。

三.Python 线程条件变量 Condition 使用

案例一:成语接龙

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 线程条件变量 Condition.py
@Time:2021/05/04 07:37
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""# 导入线程模块
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(target=thread_one,args=("A"))t2 = threading.Thread(target=thread_two,args=("B"))# 启动线程 -- 注意线程启动顺序,启动顺序很重要t2.start()t1.start()# 阻塞主线程,等待子线程结束t1.join()t2.join()print("程序结束!")'''
输出结果:A:成语接龙准备好了吗
B:准备好了~开始吧!
A:一干二净
B:净你妹啊,没法接...来个简单点的...
A:一天就知道看抖音美女,给你来个简单点的,来了:毛手毛脚
B:嘿,这个我知道:脚踏实地
A:哟哟哟,不错不错!
程序结束!
'''

案例二:生产者与消费者模式,以吃火锅为例:一盘老肉片有 10 块肉,吃完了又重新往锅里加….

  • 生产者:往锅里加老肉片,每次加一盘(10 块);
  • 消费者:吃煮熟的肉片,没吃一片,肉片数量减一,吃完为止;
# !usr/bin/env python
# -_- coding:utf-8 \__-"""@Author:猿说编程@Blog(个人博客地址): www.codersrc.com@File:Python 线程条件变量 Condition.py@Time:2021/05/04 07:37@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""#  导入线程模块import threadingimport time#  创建条件变量 conditioncon = 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(target=thread_producer)t2 = threading.Thread(target=thread_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.全局变量要声明关键字 global;
  • 2.注意线程的启动顺序,这个很重要;

四.Python 线程条件变量 Condition 总结

注意线程互斥锁 Lock / 线程事件 Event / 线程条件变量 Condition 三者的区别,场景不同,使用方式也不同,前两者一般可以作为简单的线程交互,线程条件变量 Condition 可以用于比较复杂的线程交互

五.猜你喜欢

  1. Python 条件推导式
  2. Python 列表推导式
  3. Python 字典推导式
  4. Python 函数声明和调用
  5. Python 不定长参数 *argc/**kargcs
  6. Python 匿名函数 lambda
  7. Python return 逻辑判断表达式
  8. Python 字符串/列表/元组/字典之间的相互转换
  9. Python 局部变量和全局变量
  10. Python type 函数和 isinstance 函数区别
  11. Python is 和 == 区别
  12. Python 可变数据类型和不可变数据类型
  13. Python 浅拷贝和深拷贝
  14. Python 文件读写操作
  15. Python 异常处理
  16. Python 模块 import
  17. Python __name__ == ‘__main__’详细解释

未经允许不得转载:猿说编程 » Python 线程条件变量 Condition

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BugkuCTF-WEB题eval

基础知识: var_dump() 函数用于输出变量的相关信息。 var_dump() 函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。 此题考察php相关 include是将flag.php文件包含进页面代码 $request…

Cloud一分钟 | 微软Azure云服务宣布又一重磅应用落地;微软云计算转型迅猛,或助其市值短期达到1万亿美元...

Hello,everyone:10月26日早,星期五,祝大家工作愉快!一分钟新闻时间:完1.微信群:添加小编微信:tangguoyemeng,备注“进群姓名公司职位”即可,加入【云计算学习…

Python 线程定时器 Timer - Python零基础入门教程

目录 一.Python 线程定时器 Timer 原理二.Python 线程定时器 Timer 使用三.Python 线程定时器 Timer 总结四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 相对前面几篇 Python 线程内容而言,本片内容相对比较简单&#xff0c…

BugkuCTF-Reverse题Easy_Re多方法解决

下载附件 首先打开程序: 方法一: 第一步PEID,发现为cpp文件,32位程序 根据flag格式:DUTCTF{} 扔进IDA里,直接在16进制编辑器里AltT搜索CTF字符串 Flag:DUTCTF{We1c0met0DUTCTF} 或者在010editor里查…

云漫圈 | 我觉得我的手机被监听了。。。

参加 2018 AI开发者大会,请点击 ↑↑↑完1.微信群:添加小编微信:tangguoyemeng,备注“进群姓名公司职位”即可,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!2.征稿:投…

BugkuCTF-Reverse题Easy_vb多方法解决

先查壳: 我们可以看到这个是Visual Basic 编写的程序,因此,这个是没有加壳的VB程序。 方法一: MCTF{N3t_Rev_1s_E4ay}改为flag{N3t_Rev_1s_E4ay} 方法二: IDA,F5 方法三: OD打开文件 智能…

Python 线程信号量 semaphore - Python零基础入门教程

目录 一.Python 线程信号量 semaphore 简介二.Python 线程信号量 semaphore 原理三.Python 线程信号量 semaphore 函数介绍四.Python 线程信号量 semaphore 使用五.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.Python 线程信号量 sem…

【有奖倒计时】带你走进AI应用创新大赛十强背后的故事!

时光如梭,截至今日距离?DigiX极客AI应用创新大赛十强争霸投票阶段只剩最后2天联盟君想问下你领到奖品了吗虽然战场无声无息,形势却如火如荼。13天来,我们感受到了众多花粉的热情,也感受到了用户们对高质量AI作品的喜爱。为投票准…

Python 线程障碍对象 Barrier - Python零基础入门教程

目录 一.Python 线程障碍对象 Barrier 简介二.Python 线程障碍对象 Barrier 原理三.Python 线程障碍对象 Barrier 函数介绍四.Python 线程障碍对象 Barrier 使用 1.案例一:常规使用2.案例二:重置线程障碍数量 reset 五.猜你喜欢 零基础 Python 学习路线…

BugkuCTF-PWN题pwn1-瑞士军刀

注意: nc ip 端口 敲完回车没有回显,直接输入ls命令然后cat 文件即可 得到flag

Cloud一分钟 | 加码云计算!IBM斥340亿美元收购Red Hat

Hello,everyone:10月29日早,星期一,祝大家工作愉快!一分钟新闻时间:完1.微信群:添加小编微信:tangguoyemeng,备注“进群姓名公司职位”即可,加入【云计算学习…

Python 线程队列 Queue – FIFO - Python零基础入门教程

目录 一.Python 线程队列分类二.Python 线程先进先出队列 Queue 简介三.Python 线程先进先出队列 Queue 常用函数四.Python 线程先进先出队列 Queue 使用五.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 之前的文章中讲解很多关于线程间通…

BugkuCTF-WEB题网站被黑

利用御剑扫描后台或者通过dirsearch扫描一下目录看看 得到http://1147.67.246.176:15607/shell.php 打开这个网址 发现需要登录密码 通过Burp添加字典爆破密码为hack 输入得到flag

IBM 收购 RedHat(红帽)!340 亿美元

IBM今天宣布了以高达340亿美元的价格收购Red Hat,这笔交易在开源软件行业和云计算行业势必都会引起地震。Red Hat是将开源软件商业化的先驱之一,其采用的模式是,代码免费提供给其他公司使用,以便重新分发和修改。开源软件已逐渐成…

Python 线程队列 LifoQueue – LIFO - Python零基础入门教程

目录 一.Python 线程队列 Queue 分类二.Python 线程先进后出队列 LifoQueue 简介三.Python 线程先进后出队列 LifoQueue 函数介绍四.Python 线程先进后出队列 LifoQueue 使用五.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python 线…

BugkuCTF-WEB题本地管理员

基础知识: base64: 是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一类基于64个可打印字符来表示二进制数据的方法。 XFF伪造请求头: X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的…

你最关心的马蜂窝事件舆论全景图在这里,用文本挖掘一挖到底

原创作者:谭婧,苏格兰折耳喵企业作为社会基本的细胞,在守法盈利的同时,担负着服务消费者、社区、社会等利益相关方的重要责任。互联网企业是互联网时代的宠儿,举手投足备受关注。所谓成也萧何,败也萧何。大…

Kafka日志

位置 server.properties配置文件中通过log.dir指定日志存储目录 log.dir/{topic}-{partition} 核心文件 .log 存储消息的日志文件,固定大小为1G,写满后会新增一个文件,文件名表示当前日志文件记录的第一条消息的偏移量。 .index 以偏移…

BugkuCTF-WEB题源码

根据提示 查看源码 有URL编码 解码并将其拼接 有一个假flag提交 得到真flag

Python 线程优先队列 PriorityQueue - Python零基础入门教程

目录 一.Python 线程队列 Queue 分类二.Python 线程优先队列 PriorityQueue 简介三.Python 线程优先队列 PriorityQueue 函数介绍四.Python 线程优先队列 PriorityQueue 使用五.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 线程队列…