文章首发微信公众号,微信搜索:猿说python

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

一.线程条件变量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的作用就是通知所有线程;

二.线程条件变量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.com@File:python_.py
@Time:2019/10/21 21:25@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块);

消费者:吃煮熟的肉片,没吃一片,肉片数量减一,吃完为止;

# 导入线程模块
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(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.注意线程的启动顺序,这个很重要;

四.重点总结

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

猜你喜欢:

1.python线程创建和参数传递

2.python线程互斥锁Lock

3.python线程事件Event

4.python return逻辑判断表达式

转载请注明:猿说Python » python条件变量Condition

想了解更多python内容请直接搜索微信公众号:猿说python

Python教程 - 猿说Python​www.shuopython.com

本人也还在学习python中,博客会持续更新ing,有兴趣的小伙伴关注走一波,推荐浏览个人博客网站:猿说python,文章采用树状分类,结构目录清晰一点,文章内容有问题的话欢迎给出建议或者直接留言.

python 线程超时设置_python 条件变量Condition(36)相关推荐

  1. python 线程超时设置_python多任务之总结——(二)线程、协程

    本文主要讲述进程线程协程在python中的使用.主要说明各自的创建.通信及联系与区别,了解各自的适用场景,能更好的利用并发实现多任务开发. 第一部分:python多任务之总结--(一)进程学习 线程 ...

  2. python 线程超时设置_爬虫基础知识(一)多线程与threading模块

    点击上方"蓝字"关注我们,第一时间推送优质文章! 前言 "本期带来的文章是python中多线程与threading模块的主要内容.主要分为「并发与并行」,「进程与线程」, ...

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

    目录 一.Python 线程条件变量 Condition 函数 二.Python 线程条件变量 Condition 原理 三.Python 线程条件变量 Condition 使用 四.Python 线 ...

  4. posix多线程有感--线程高级编程(条件变量)

    1.初始化条件变量pthread_cond_init int pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr) ...

  5. python 线程安全队列_Python实现线程安全队列

    原标题:Python实现线程安全队列 作者:愤怒的屎壳螂 来源:http://blog.csdn.net/hit0803107/article/details/52876143 最近学习spark,我 ...

  6. 对条件变量(condition variable)的讨论

    作者:王东 1.1       什么是条件变量和条件等待? 简单的说: 条件变量(condition variable)是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待某个 ...

  7. 条件变量(condition variable)详解

    原理: 假设我们需要解决这样一个问题:一个列表记录需要处理的任务.一个线程往此列表添加任务,一个线程processTask处理此列表中的任务.这个问题的一个关键点在于processTask怎么判断任务 ...

  8. java 设置超时_java线程超时设置方法

    对于java中线程超时间可以使用ExecutorService与Timer来控制一个线程什么时候超时了,下面我整理了一些方法,这些文章都详细的介绍java线程超时设置技巧. 方法一 本例子使用Exec ...

  9. python线程通信 消息传递_Python并发编程之线程消息通信机制/任务协调(四)

    大家好,并发编程进入第四篇. 本文目录 前言 Event事件 Condition Queue队列 总结 .前言 前面我已经向大家介绍了,如何使用创建线程,启动线程.相信大家都会有这样一个想法,线程无非 ...

最新文章

  1. python尝试不同的随机数进行数据划分、使用卡方检验依次计算不同随机数划分下训练接和测试集所有分类特征的卡方检验的p值,如果所有p值都大于0.05则训练集和测试集都具有统计显著性、数据划分合理
  2. 清华大学:2021元宇宙发展研究报告
  3. SmartDoc(YUIDoc) 注释编写
  4. python怎么打开交互式窗口-在交互式环境中执行Python程序过程详解
  5. linux修改upd53端口,Centos iptables打开端口53
  6. 想要 24 小时自学编程,那是不可能的,先自学 10000 小时再说!
  7. App的selenium,Appium爬App!
  8. Python String:一文彻底粉碎字符串
  9. Pipenv – 超好用的 Python 包管理工具 1
  10. 美国python网课免费-去不了USA?那又怎样?美国名校网课免费学!
  11. PHP程序员40点陋习
  12. 中国移动2020校招应聘攻略—笔试篇
  13. 【竞赛笔记】飞思卡尔智能车竞赛
  14. 第12课:(2)线性回归建模实验
  15. 使用echarts生成海友网企业全国分布地图
  16. Unity 3D官方教程——Tanks!学习记录
  17. 四川麻将必胜攻略笔记(入门篇1)
  18. 如果从学渣角度理解booth算法
  19. 2021高考公务员成绩查询,2021国家公务员考试成绩查询入口开通时间
  20. 春季高考计算机基础知识试题,2020年天津市春季高考计算机预测模拟试卷(含答案)...

热门文章

  1. 关于Services.exe开机CPU内存使用暴增解决方案
  2. (原)学习ORACLE 视图
  3. 洛谷 - P1217 - 回文质数 - 枚举
  4. Redis的key和value大小限制
  5. Luogu P2577 [ZJOI2005]午餐
  6. while和do-while循环结构
  7. 使用css绘制小三角
  8. mybatis实战教程(mybatis in action)之二:以接口的方式编程
  9. php连接数据库输出的中文几个字就…
  10. SQLserver2000 实例管理工具