正式的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类,田径赛场上的主裁判相关推荐

  1. Python的线程18 Condition类实现田径运动场景

    正式的Python专栏第55篇,同学站住,别错过这个从0开始的文章! 前篇学委简单介绍了Condition类.这个类有几个特别的函数. 当一个裁判员获取锁,然后执行notify_all函数后,其他运动 ...

  2. python结束线程类_Python线程指南(转)

    1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2. 线程同步(锁) 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样).但是当线程需要共享数据时,可能存在 ...

  3. Python入门之——线程threading(Thread类)简介

    几乎所有的操作系统都支持同时运行多个任务,每个任务通常是一个程序,每一个运行中的程序就是一个进程,即进程是应用程序的执行实例.现代的操作系统几乎都支持多进程并发执行.注意,并发和并行是两个概念,并行指 ...

  4. java 线程同步condtion_Java:多线程,使用同步锁(Lock)时利用Condition类实现线程间通信...

    [我们不仅可以使用synchronized来实现多线程同步,还可以通过创建锁对象来实现多线程的同步,还是上次模拟取现的操作,这次利用lock对象实现同步,下面是代码:    import 如果程序不使 ...

  5. python的线程组怎么写_Python学习——Python线程

    一.线程创建 1 #方法一:将要执行的方法作为参数传给Thread的构造方法 2 importthreading3 importtime4 5 defshow(arg):6 time.sleep(2) ...

  6. python的线程如何启用和结束_python线程进程

    操作系统 一 为什么要有操作系统? 现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入 输出设备组成的复杂系统,每位程序员不可能掌握所有系统实现的细节 ...

  7. 〖Python〗-- 线程、进程、协程

    [线程.进程.协程] 学习进程.线程.协程,引申一些内容 为什么要学习进程和线程: 进程和线程目的是为了:提高执行效率 现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支 ...

  8. 搞事情 -- python之线程

    简介 操作系统线程理论 线程概念的引入背景 线程的特点 进程和线程的关系 使用线程的实际场景 用户级线程和内核级线程(了解) 线程和python 理论知识 线程的创建Threading.Thread类 ...

  9. python 判断线程状态_Python线程指南

    Python线程指南 本文介绍了Python对于线程的支持,包括"学会"多线程编程需要掌握的基础以及Python两个线程标准库的完整介绍及使用示例. 注意:本文基于Python2. ...

最新文章

  1. 成功抓取douban 所有电影
  2. ngx_timeofday,定时器管理
  3. java调用lingo_使用Lingo增强JMS
  4. 诗与远方:无题(二十二)
  5. python抓有趣的东西_Python 五个有趣的彩蛋,你都知道吗?
  6. cad文字提取到excel_别怕!CAD表格与EXCEL之间的转化,有它就够了
  7. java线程如何继承,java多线程(一)之继承Thread类
  8. mysql 5.7多层级json查询_MySql5.7 json查询
  9. java生日正则表达式_Java语言十五讲
  10. 第二模块:函数编程 第1章·文件处理、函数、装饰器、迭代器、内置方法
  11. 让美国颤抖的5G,到底牛在哪里?
  12. java聊天室项目_JAVA聊天室项目展示.ppt
  13. 阿里巴巴 Java面经
  14. sql server 2000 版本及sp4补丁说明
  15. 07——Vue 中的事件处理 以及 事件修饰符 、键盘事件
  16. ubuntu下安装vmware workstation
  17. TF学习——TF之TensorFlow Slim:TensorFlow Slim的简介、安装、使用方法之详细攻略
  18. javascript 知识
  19. 基于瞬时功率理论的APF的SIMULINK模型
  20. sudo apt-get install build-essential的作用

热门文章

  1. react 自定义日历 手把手教你
  2. java达内项目_达内课程:完成一个项目的整个流程
  3. Linux Redhat 7.6 操作系统 下载安装详解
  4. 51kantv是什么?桌面上总是出现51kantv,怎么办?
  5. 【前端趋势】Vue、Vite作者尤雨溪前端趋势2022主题演讲
  6. torchAudio中wav2vec2的源码(三)——transformer-encoder的构建
  7. php时间问候语,时间问候语大全
  8. Flash破解与防破解(转载)
  9. 【Python笔记】获取星期几在指定年份的所有日期
  10. Doris安装(一)之docker编译+fe和be的配置与启动