Python的线程17 Condition类,田径赛场上的主裁判
正式的Python专栏第54篇,同学站住,别错过这个从0开始的文章!
前面介绍了死锁,Lock,Rlock,这篇我们介绍一下Condition
Condition 是什么?
这个类跟Lock和Rlock类似,但是多了wait/notify/notify_all(Java里面对应的是notifyAll)等方法,这个搞过Java的同学就非常熟悉了。
如下图,它的acquire和release方法沿用了传入的lock对象(或者默认的Rlock对象)。
所以这两个熟悉的方法,可以参考前面分享的Lock和Rlock文章。
学委这里重点讲述wait和notify,notify_all
模拟10个运动员等候信号,准备开跑!
我们看看下面的代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/1/23 11:19 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : thread_condition.py
# @Project : hello
import threading
import timecondition = threading.Condition()def wait_and_run():condition.acquire()print("%s wait for signal " % threading.current_thread().name)condition.wait()print("% run" % threading.current_thread().name)time.sleep(1)print("% completed" % threading.current_thread().name)condition.release()threads = []
for i in range(1, 11):t = threading.Thread(name="运动员" + str(i), target=wait_and_run)threads.append(t)def fire():condition.acquire()print("预备")condition.notify_all()condition.wait()print("3...")time.sleep(1)print("2...")time.sleep(1)print("1...")time.sleep(1)print("fire")condition.notify_all()threading.Thread(name="主裁判", target=fire).start()
for t in threads:t.start()
for t in threads:t.join()print("看热闹")
这个代码有10个运动员线程,他们都在等待一个信号,然后开始竞赛,跑起来。
我们看到线程后面有一个主裁判线程,他负责处罚fire函数。
我们看到fire函数,会执行notify_all, 唤醒所有等待的运动员。
问题来了?等半天,裁判咋不喊3/2/1啊?
你知道为什么吗?
这里展示的notify_all(下面的第二行,已经通知了所有运动员开始准备。
接着裁判程序就运行到condition.wait(), 这时候裁判线程跟其他运动员一样,都进入等待状态了。
问题来了,谁来喊裁判和所有运动员(开始跑)。
def fire():condition.acquire()condition.notify_all()print("预备")condition.wait()//3/2/1/ 然后再notify_all
读者可以思考一下,学委这里提示一下,wait函数还也有支持超时机制。
总结
本篇介绍的Condition类,相比Lock/Rlock更复杂。
它可以实现多个线程等待一个它条件,就像田径赛场上的主裁判一样。
如果我们打开这个类的源代码(最前面的一张截图),我们会发现其内部维护了一个Rlock(默认情况下)。
可以在创建Condition对象的时候,传入一个lock对象(可以是Lock或者Rlock)来修改。
喜欢Python的朋友,请关注学委的 Python基础专栏 or Python入门到精通大专栏
持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
欢迎关注微信,点赞支持收藏!
Python的线程17 Condition类,田径赛场上的主裁判相关推荐
- Python的线程18 Condition类实现田径运动场景
正式的Python专栏第55篇,同学站住,别错过这个从0开始的文章! 前篇学委简单介绍了Condition类.这个类有几个特别的函数. 当一个裁判员获取锁,然后执行notify_all函数后,其他运动 ...
- python结束线程类_Python线程指南(转)
1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2. 线程同步(锁) 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样).但是当线程需要共享数据时,可能存在 ...
- Python入门之——线程threading(Thread类)简介
几乎所有的操作系统都支持同时运行多个任务,每个任务通常是一个程序,每一个运行中的程序就是一个进程,即进程是应用程序的执行实例.现代的操作系统几乎都支持多进程并发执行.注意,并发和并行是两个概念,并行指 ...
- java 线程同步condtion_Java:多线程,使用同步锁(Lock)时利用Condition类实现线程间通信...
[我们不仅可以使用synchronized来实现多线程同步,还可以通过创建锁对象来实现多线程的同步,还是上次模拟取现的操作,这次利用lock对象实现同步,下面是代码: import 如果程序不使 ...
- python的线程组怎么写_Python学习——Python线程
一.线程创建 1 #方法一:将要执行的方法作为参数传给Thread的构造方法 2 importthreading3 importtime4 5 defshow(arg):6 time.sleep(2) ...
- python的线程如何启用和结束_python线程进程
操作系统 一 为什么要有操作系统? 现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入 输出设备组成的复杂系统,每位程序员不可能掌握所有系统实现的细节 ...
- 〖Python〗-- 线程、进程、协程
[线程.进程.协程] 学习进程.线程.协程,引申一些内容 为什么要学习进程和线程: 进程和线程目的是为了:提高执行效率 现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支 ...
- 搞事情 -- python之线程
简介 操作系统线程理论 线程概念的引入背景 线程的特点 进程和线程的关系 使用线程的实际场景 用户级线程和内核级线程(了解) 线程和python 理论知识 线程的创建Threading.Thread类 ...
- python 判断线程状态_Python线程指南
Python线程指南 本文介绍了Python对于线程的支持,包括"学会"多线程编程需要掌握的基础以及Python两个线程标准库的完整介绍及使用示例. 注意:本文基于Python2. ...
最新文章
- 成功抓取douban 所有电影
- ngx_timeofday,定时器管理
- java调用lingo_使用Lingo增强JMS
- 诗与远方:无题(二十二)
- python抓有趣的东西_Python 五个有趣的彩蛋,你都知道吗?
- cad文字提取到excel_别怕!CAD表格与EXCEL之间的转化,有它就够了
- java线程如何继承,java多线程(一)之继承Thread类
- mysql 5.7多层级json查询_MySql5.7 json查询
- java生日正则表达式_Java语言十五讲
- 第二模块:函数编程 第1章·文件处理、函数、装饰器、迭代器、内置方法
- 让美国颤抖的5G,到底牛在哪里?
- java聊天室项目_JAVA聊天室项目展示.ppt
- 阿里巴巴 Java面经
- sql server 2000 版本及sp4补丁说明
- 07——Vue 中的事件处理 以及 事件修饰符 、键盘事件
- ubuntu下安装vmware workstation
- TF学习——TF之TensorFlow Slim:TensorFlow Slim的简介、安装、使用方法之详细攻略
- javascript 知识
- 基于瞬时功率理论的APF的SIMULINK模型
- sudo apt-get install build-essential的作用
热门文章
- react 自定义日历 手把手教你
- java达内项目_达内课程:完成一个项目的整个流程
- Linux Redhat 7.6 操作系统 下载安装详解
- 51kantv是什么?桌面上总是出现51kantv,怎么办?
- 【前端趋势】Vue、Vite作者尤雨溪前端趋势2022主题演讲
- torchAudio中wav2vec2的源码(三)——transformer-encoder的构建
- php时间问候语,时间问候语大全
- Flash破解与防破解(转载)
- 【Python笔记】获取星期几在指定年份的所有日期
- Doris安装(一)之docker编译+fe和be的配置与启动