Threading Module源码概述(一)
Python的Threading模块是建立在thread module基础上的一个模块,在threading模块中,暴露着许多thread模块的属性。比如threading._get_ident实际上就是thread.get_ident.
_start_new_thread = thread.start_new_thread
_allocate_lock = thread.allocate_lock
_get_ident = thread.get_ident
ThreadError = thread.error
在threading模块中,有一套记录当前所有通过继承threading.Thread而创建的python线程的机制。这个机制通过两个dict 和一个lock完成。
# Active thread administration
_active_limbo_lock = _allocate_lock()
_active = {} # maps thread id to Thread object
_limbo = {}
threading.py
我们知道通过threading.Thread创建多线程有两个阶段。
第一个阶段调用threading.Thread.start
第二个阶段是在threading.Thread.start中调用threading.Thread.run。
当处于第一阶段时,还没有调用thread.start_new_thread创建原生子线程,这时候把线程记录在了_limbo中。由于没有创建子线程,所以现在没有线程id,记录方式为 _limbo[self] = self。在第二阶段,已经成功地调用thread.start_new_thread创建原生子线程,这时将从_limbo中删除子线程,而将子线程记录到_active中,记录方式为_active[self.__ident] = self 或者_active[thread_id] = thread。可见,这Python这两个dict分别维护了自己已经创建和等待创建的子线程集合。对这两个dict的访问都在_active_limbo_lock的保护之下进行。
def start(self):
with _active_limbo_lock:
_limbo[self] = self #将线程添加到dict中
第一步
def start(self):
try: #调用_start_new_thread创建子线程
_start_new_thread(self.__bootstrap, ()) def __bootstrap(self):
try:
self.__bootstrap_inner() def __bootstrap_inner(self):
try:
self._set_ident() #获得线程id
self.__started.set()
with _active_limbo_lock:
_active[self.__ident] = self #将线程id保存到_active的dict
del _limbo[self] #移除之前limbo字典中的线程
第二步
Threading Module源码概述(一)的更多相关文章
- Threading Module源码概述(二)
在threading 模块中,提供了列举当前所有子线程的操作.threading.enumerate.这个操作很简单,就是将_active和_limbo中维护的线程集合的信息输出. def enume ...
- Threading Module源码概述(三)
Threading中的Thread threading中一个关键的组件是threading.Thread. class Thread(_Verbose): __initialized = False ...
- MongoDB源码概述——内存管理和存储引擎
原文地址:http://creator.cnblogs.com/ 数据存储: 之前在介绍Journal的时候有说到为什么MongoDB会先把数据放入内存,而不是直接持久化到数据库存储文件,这与Mong ...
- Kakfa揭秘 Day3 Kafka源码概述
Kakfa揭秘 Day3 Kafka源码概述 今天开始进入Kafka的源码,本次学习基于最新的0.10.0版本进行.由于之前在学习Spark过程中积累了很多的经验和思想,这些在kafka上是通用的. ...
- 安卓图表引擎AChartEngine(二) - 示例源码概述和分析
首先看一下示例中类之间的关系: 1. ChartDemo这个类是整个应用程序的入口,运行之后的效果显示一个list. 2. IDemoChart接口,这个接口定义了三个方法, getName()返回值 ...
- python线程threading.Timer源码解读
threading.Timer的作用 官方给的定义是: """Call a function after a specified number of seconds: t ...
- threading.local()源码分析
前段时间写了个多线程的程序,了解到Python中有个与众不同的thread.local()方法,可以创建一个全局对象,各个线程可以用这个全局对象保存各自的局部变量,而在使用时不受其他线程的影响.于是抽 ...
- elasticsearch 源码概述
从功能上说,可以分为两部分,分布式功能和数据功能.分布式功能主要是节点集群及集群附属功能如restful借口.集群性能检测功能等,数据功能主要是索引和搜索.代码上这些功能并不是完全独立,而是由相互交叉 ...
- python语言线程标准库threading.local源码解读
本段源码可以学习的地方: 1. 考虑到效率问题,可以通过上下文的机制,在属性被访问的时候临时构建: 2. 可以重写一些魔术方法,比如 __new__ 方法,在调用 object.__new__(cls ...
随机推荐
- Swift中共有74个内建函数
Swift中共有74个内建函数,但是在Swift官方文档(“The Swift Programming Language”)中只记录了7中.剩下的67个都没有记录. 本文将列举Swift所有的内建 ...
- 根据CreateDirectory递归创建多级目录
分为MFC下的和非MFC下的两种,MFC路径是CString类型的,非MFC的路径是wstring类型的. 下面是MFC下的创建目录: void __fastcall RecursiveDirecto ...
- 292. Nim Game(C++)
292. Nim Game(C++) You are playing the following Nim Game with your friend: There is a heap of stone ...
- AbstractFactory 模式
///////////////////////Product.h////////////// #ifndef _PRODUCT_H_ #define _PRODUCT_H_ class Abstrac ...
- vim技巧和坑
VIM的匹配替换功能很快很强大,但是要显示匹配个数就很苦情,要绕个弯子实现:%s/xxx//gn关键是最后的n,代表只报告匹配的个数,而不进行实际的替换. vim v5 强大.. 另外,如果你习惯了w ...
- topcoder算法练习2
Problem Statement In most states, gamblers can choose from a wide variety of different lottery ...
- zTree异步生成数据时无法获取到子节点的选中状态
最近在项目中遇到一个问题,需求如下: 根据选中不同的人员(ID)向后台发送ajax请求,通过返回的数据来生成该人员的权限访问树,该树目录最少为3级目录,在生成的时候会自动勾选上次保存过的选中状态,点击 ...
- php笔记之GD库图片创建/简单验证码
燕十八 公益PHP培训 课堂地址:YY频道88354001 学习社区:www.zixue.it php画图:比如说验证码,缩略图,加水印都要用到GD库,所以要开启gd2库,才能用 首先找到php.in ...
- IOS“多继承”
转自念茜的博客: 当单继承不够用,很难为问题域建模时,我们通常都会直接想到多继承.多继承是从多余一个直接基类派生类的能力,可以更加直接地为应用程序建模.但是Objective-C不支持多继承,由于消息 ...
- bzoj1136: [POI2009]Arc
Description 给定一个序列{ai | 1 <= ai <= 1000000000 且 1 <= i <= n 且 n <= 15000000}和一个整数 k ( ...