紧接着上一篇文章继续解析源码

甘蔗:python标准库threading源码解读【一】​zhuanlan.zhihu.com


目录

  1. Event的介绍和用法
  2. Event源码解析

以后的内容尽量少一点并且结合某个类的用法来介绍,这样更容易理解。

1.Event的介绍和用法

可以参考下:

浅析Python多线程 - 云+社区 - 腾讯云​cloud.tencent.com

Event中的锁通过Condition实现,用到了类Condition中的wait()和notify_all()方法。

Event提供了一个信号标志flag,利用flag的状态就可以实现线程之间的相互依赖;包含wait(),clear(),set(),is_set()方法和私有方法_reset_internal_locks()。

is_set() 获取event的设置值,默认为False
set() 设置event的值为True
clear() 设置event的值为False
wait() 等到event的值被设为True就执行

# 代码来自上述链接
import threading
import timedef traffic_light(event):count = 0event.set()while True:# 如果计数器[0, 5)之间, 红灯,event=Falseif 0 <= count < 5:event.clear()print("light is Red")# 如果计数器[5, 10)之间, 绿灯,event=Trueelif 5 <= count < 10:event.set()print("light is Green")# 如果计数器大于10,红灯,将event设置为False,计数器置为0else:event.clear()count = 0time.sleep(1)count += 1def car(name, event):while True:if not event.is_set():# event为False, 表示红灯, 车只能等待print("RED, the %s is waiting..." % name)# 此处会阻塞住,直到event被设置为True在执行event.wait()print("Green, The %s going...." % name)e = threading.Event()
light = threading.Thread(target=traffic_light, args=(e,))
light.start()
car1 = threading.Thread(target=car, args=("Tesla", e, ))
car1.start()

线程car在输出“RED。。。。。。”之后会在wait()中一直等待,直到event的信号标志量为True;

线程light在0-5时,只会调用event.clear(),event的信号标志量一直为False;线程car没有动静;

线程light在6-10时,只会调用event.set(),event的信号标志量一直为True;线程car可以被调用;

实现了线程car对线程light的依赖。

2.Event源码解析

直接看源码

# 源码 1/3
class Event:def __init__(self):self._cond = Condition(Lock())self._flag = Falsedef _reset_internal_locks(self):# private!  called by Thread._reset_internal_locks by _after_fork()self._cond.__init__(Lock())def is_set(self):"""Return true if and only if the internal flag is true."""return self._flagisSet = is_set

def __init__(self):

定义condition锁和标志量flag

def _reset_internal_locks(self):

好像是线程异常退出的时候,重新设置线程锁condition的东西,后面写到了再学习学习

def is_set(self):

这个简单,返回flag状态

    # 源码 2/3def set(self):"""Set the internal flag to true.All threads waiting for it to become true are awakened. Threadsthat call wait() once the flag is true will not block at all."""with self._cond:self._flag = Trueself._cond.notify_all()def clear(self):"""Reset the internal flag to false.Subsequently, threads calling wait() will block until set() is called toset the internal flag to true again."""with self._cond:self._flag = False

【注释我都不想删掉了,凑点字数23333】

def set(self):

flag首先设为True,继而释放所有线程

def clear(self):

flag设为False

    # 源码 3/3def wait(self, timeout=None):"""Block until the internal flag is true.If the internal flag is true on entry, return immediately. Otherwise,block until another thread calls set() to set the flag to true, or untilthe optional timeout occurs.When the timeout argument is present and not None, it should be afloating point number specifying a timeout for the operation in seconds(or fractions thereof).This method returns the internal flag on exit, so it will always returnTrue except if a timeout is given and the operation times out."""with self._cond:signaled = self._flagif not signaled:signaled = self._cond.wait(timeout)return signaled

def wait(self, timeout=None):

先判断flag信号,只有当前状态下flag是False才会进行等待,并且释放condition一级锁(也就是实例化Event类中定义的 self._cond = Condition(Lock())

Event.wait()函数在被Event.set()函数唤醒之后,在类condition的wait()函数中的finally尝试恢复一级锁;set()函数在下一句代码中才会释放锁;释放之后难道一定会是finally中的语句拿到嘛?不过我倒是感觉谁拿到这个所都无所谓。。。

END

print python 带回车_python标准库threading源码解读【二】相关推荐

  1. python库源码分析_python第三方库Faker源码解读

    源码背景 Faker是一个Python第三方库,GITHUB开源项目,主要用于创建伪数据创建的数据包含地理信息类.基础信息类.个人账户信息类.网络基础信息类.浏览器信息类.文件信息类.数字类 文本加密 ...

  2. python字符串库函数_Python标准库概览(1):string

    Python的 string 标准库保留了一些有用的函数和用于处理文本对象的类,现在我们来一起看一下Python的string标准库还有哪些我们不知道的有趣用法? 01.capwords()函数:将字 ...

  3. python groupby用法_Python 标准库实践之合并字典组成的列表

    作者 | 陈祥安 来源 | Python学习开发 最近做了个数据合并的需求这里记录下: 要求如下: dict_of_list1 = [{"name": "zhangsan ...

  4. python文件管理包_Python标准库04 文件管理 (部分os包,shutil包)

    Python标准库04 文件管理 (部分os包,shutil包) 在操作系统下,用户可以通过操作系统的命令来管理文件,参考.Python 标准库则允许我们从 Python 内部管理文件.相同的目的,我 ...

  5. 是谁在Go标准库的源码中植入了色情网站?

    昨天,有网友在群里说在GitHub上发现了色情网站! GitHub上怎么会有色情网站呢?网友给出了下面的截图: 这个出现在Go标准库中的Issue里面,有一个url- 该Issue地址:https:/ ...

  6. python计算平均数_Python标准库——数学运算

    平均值 statistics模块实现了很多常用的统计公式,允许使用Python的各种数值类型(int.float.Decimal和Fraction)来完成高效计算. 共支持3种形式的平均值:均值(me ...

  7. python指数运算_Python标准库——数学运算

    指数和对数 指数生长曲线在经济学.物理学和其他学科中经常出现.Python有一个内置的幂运算符("**"),不过,如果需要将一个可调用函数作为另一个函数的参数,那么困难需要用到po ...

  8. python configparser模块_Python标准库之ConfigParser模块

    ConfigParser模块用于生成和修改常见配置文档. 比如配置文件格式如下: [DEFAULT] ServerAliveInterval= 45Compression=yes Compressio ...

  9. python itertools模块_Python标准库:itertools模块

    来源:j_hao104 简介 官方描述:Functional tools for creating and using iterators.即用于创建高效迭代器的函数. itertools.chain ...

最新文章

  1. Leetcode-13. 罗马数字转整数(C++)
  2. 小程序 ---- (引入iconfont,自定义组件内不显示iconfont)
  3. mysql 水晶报表_Crystal Reports 2008(水晶报表) JDBC连接mysql数据库
  4. 三菱FX5U,机床X轴Y轴工作台定位控制程序 使用三菱J4-A系列伺服驱动器绝对位置系统,程序大小27000多步
  5. HCIE学习笔记(2)之ISIS Overload
  6. word文件做一半未响应_Word 2016 开个别文档总是未响应
  7. 解决Android调试不显示 “允许USB调试” 认证窗口
  8. 网络克隆自动修改计算机名ip,网络克隆之自动更改IP地址和计算机名
  9. vue3基础 —— 子传父
  10. 上海某大型企业因盗版Catia被罚千万
  11. 机顶盒宽带拨号失败服务器未响应,机顶盒详细错误代码.doc
  12. matlab 资料分享
  13. 关于Paxos的历史
  14. CCPC-Wannafly Summer Camp 2019 全记录
  15. C# 开发DirectX.DirectSound录音在Win10兼容解决方法
  16. 万能播放器KMPlayer
  17. 文本图形处理(扭曲变形、增强等)的源代码列表-2
  18. 数据挖掘导论学习总结——第四章
  19. 联邦学习 深度学习对抗攻击
  20. Java的编码方式、单个char类型存储大部分中文字符、getBytes()、new String()的转换流程

热门文章

  1. 泰勒展开与找第一项系数不为1的解题策略
  2. 计算机系统内部五大部件的主要连接关系总结
  3. latex参考文献,首字母大写
  4. win10 安装tensorflow-gpu
  5. JavaScript之基础语法整理
  6. Android Application的使用及其生命周期
  7. 2014ACM/ICPC亚洲区西安站 F题 color (组合数学,容斥原理)
  8. 信息安全系统设计基础实验三:实时系统的移植
  9. Vc6.0打开该文件坠毁
  10. Nhibernate与Castle windsor (个人学习笔记1)