Threading Module源码概述(二)
在threading 模块中,提供了列举当前所有子线程的操作。threading.enumerate。这个操作很简单,就是将_active和_limbo中维护的线程集合的信息输出。
def enumerate():
with _active_limbo_lock:
return _active.values() + _limbo.values()
Threading线程同步工具
在thread模块中,Python提供了用户级别的线程同步工具:Lock对象。而在threading模块中,Python提供了不同的用于线程同步的工具。以简化用户实现多线程的应用程序。这些threading中的线程同步工具实际上都是建立在thread所提供的Lock对象的基础上的。
在threading中,我们可以在直接创建thread中的Lock对象,threading没有做任何的包装,仅仅是简单的将其展示出来。
_allocate_lock = thread.allocate_lock
Lock = _allocate_lock
通过调用threading.Lock,我们就可以创建一个thread中的Lock对象。如前面所描述的,在这个对象上,我们可以进行acquire和release等操作。在threading中的其他线程同步工具都是在这个Lock对象的基础上,下面我们将对这些线程同步工具做一个概述性的介绍。
RLock
RLock对象是Lock对象的一个变种,其内部维护着一个Lock对象,但是它是一种可重入的Lock。一般地,对于Lock对象而言,如果一个线程连续两次进行acquire操作,那么由于第一次acquire之后没有release,第二次acquire将挂起线程,这将直接导致Lock对象永远不会release,因此线程死锁。RLock对象允许一个线程多次对其进行acquire操作,因为在其内部通过一个counter变量维护着线程acquire的次数。而且每一次的acquire操作必须有一个release操作与之对应。在所有的release操作都完成之后,别的线程才能申请该RLock对象。
Condition
Condition对象是对Lock对象的包装,在创建Condition对象时,其构造函数需要一个Lock对象作为参数,如果没有这个Lock对象参数,Condition将在内部自行创建一个RLock对象。在Condition对象上,当然可以调用acquire和release操作。因为内部的Lock对象本身就支持这些操作。但是Condition的价值在于提供wait和notify的语义。假设有Condition对象C,当线程A调用C.wait()时,线程A将释放C的Lock对象。并进入阻塞状态,知道有别的线程调用C.notify(),A才会重新通过acquire申请C中的Lock对象,并退出wait操作。
Event
与Semaphore类似,Event对象实际上也是对Condition对象的一种包装,只是提供了独有的set和wait语义。
Threading Module源码概述(二)的更多相关文章
- Threading Module源码概述(一)
Python的Threading模块是建立在thread module基础上的一个模块,在threading模块中,暴露着许多thread模块的属性.比如threading._get_ident实际上 ...
- Threading Module源码概述(三)
Threading中的Thread threading中一个关键的组件是threading.Thread. class Thread(_Verbose): __initialized = False ...
- 安卓图表引擎AChartEngine(二) - 示例源码概述和分析
首先看一下示例中类之间的关系: 1. ChartDemo这个类是整个应用程序的入口,运行之后的效果显示一个list. 2. IDemoChart接口,这个接口定义了三个方法, getName()返回值 ...
- 手牵手,从零学习Vue源码 系列二(变化侦测篇)
系列文章: 手牵手,从零学习Vue源码 系列一(前言-目录篇) 手牵手,从零学习Vue源码 系列二(变化侦测篇) 陆续更新中... 预计八月中旬更新完毕. 1 概述 Vue最大的特点之一就是数据驱动视 ...
- Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题
4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...
- MongoDB源码概述——内存管理和存储引擎
原文地址:http://creator.cnblogs.com/ 数据存储: 之前在介绍Journal的时候有说到为什么MongoDB会先把数据放入内存,而不是直接持久化到数据库存储文件,这与Mong ...
- Kakfa揭秘 Day3 Kafka源码概述
Kakfa揭秘 Day3 Kafka源码概述 今天开始进入Kafka的源码,本次学习基于最新的0.10.0版本进行.由于之前在学习Spark过程中积累了很多的经验和思想,这些在kafka上是通用的. ...
- Netty 源码(二)NioEventLoop 之 Channel 注册
Netty 源码(二)NioEventLoop 之 Channel 注册 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 一 ...
- 框架-springmvc源码分析(二)
框架-springmvc源码分析(二) 参考: http://www.cnblogs.com/leftthen/p/5207787.html http://www.cnblogs.com/leftth ...
随机推荐
- angularjs-googleMap googleMap api地址解析与反解析
1.js:根据地址得到经纬度var myplace=$scope.place;//获取输入的地址var geocoder = new google.maps.Geocoder();//创建geocod ...
- mysql workbench 建表时 PK,NN,UQ,BIN,UN,ZF,AI解释
mysql workbench 建表时 - PK: primary key (column is part of a pk) 主键 - NN: not null (column is nullable ...
- xargs rm -rf 与 -exec rm
# find ./ -exec rm {} \; # find ./ | xargs rm -rf 两者都可以把find命令查找到的结果删除,其区别简单的说是前者是把find发现的结果一次性传给exe ...
- express不是内部命令解决办法
安装nodejs后,安装express,cmd下命令:npm install express -g;之后敲入express -V会提示不是内部命令,是因为, 4.0版本中将命令工具分家出来了,所以我们 ...
- iOS: 在代码中使用Autolayout (2) – intrinsicContentSize和Content Hugging Priority【转】
原文:http://www.mgenware.com/blog/?p=491 接上文:iOS: 在代码中使用Autolayout (1) – 按比例缩放和优先级. 我们继续来看在代码中使用Autola ...
- 绘图quartz之加水印
实现在图片上加一个水印 并存在document的路径下 同时在手机相册中也存一份 //首先开启imageContext找到图片 UIGraphicsBeginImageContext( ...
- JS 通过系统时间限定 动态添加 select option
虽然是个简单的效果,还是需要积累一下,记录一下: 在八月一号之后,删除最后一项,新添加2016级 — — 2015级 2014级 2013级 2012级 在六月一号之后,删除最后一项,新添加2016级 ...
- Mac使用rz、sz远程上传下载文件
习惯了 在windows下的securecrt和xshell的rz 和sz. rz 可以很方便的从客户端传文件到服务器,sz也可以很方便的从服务器传文件到客户端,就算中间隔着跳板机也不影响.在mac下 ...
- you need to be root to perform this command linux
获得root权限如何获得:打开终端,输入su回车 然后输入密码回车就行了
- MySQL存储过程实例
一.创建MySQL数据库函数 TCC:无参数,查询fruit表中的所有数据 : TAA:两个参数,查询fruit总共有多少行:查询ids为某个值时水果表的数据 TDD:两个参数,查询ids不等于某个值 ...