一个python线程池的源码解析
python为了方便人们编程高度封装了很多东西,比如进程里的进程池,大大方便了人们编程的效率,但是默认却没有线程池,本人前段时间整理出一个线程池,并进行了简单的解析和注释,本人水平有限,如有错误希望高手指点,愿与君共同学习与进步,废话少说,上源码
import threading,time,queue
stop = object()
class Thread(object):
def __init__(self,max_num):#构造函数
self.q = queue.Queue() #创建一个队列,存放任务
self.max_num = max_num #线程池最大线程数
self.terminal = False
self.generate_list = [] #真实创建的线程列表
self.free_list = [] #空闲线程列表 def generate_thread(self): #创建进程并执行的函数
t = threading.Thread(target = self.call)
t.start()
def call(self): #获取任务并且执行任务函数
current_thread = threading.currentThread #获取当前线程
self.generate_list.append(current_thread) #加入列表
even = self.q.get() #从队列获取到任务
while even != stop:#在有 任务 的情况下循环执行任务
func,args,callback = even
try:
ret = func(args) #执行函数
status = True
except Exception as e: #如果有错误status为假,执行结果fu赋值ret
status = False
ret = e
if callback is not None:#判断如果没有回调函数
try:
callback(status,ret)
except Exception as e:
pass
if self.terminal: #p判断是否终止
even = stop
else:
self.free_list.append(current_thread) #执行完毕将线程加入空闲
even = self.q.get() #再次获取
self.free_list.remove(current_thread)#修改状态为非闲置
else:
self.generate_list.remove(current_thread)#如果没有任务,会删除真实创建的线程列表中的元素 def run(self, func, args, callback=None): # 线程池运行的方法
w = (func, args, callback,)
self.q.put(w) # 将任务放进队列
if len(self.free_list) == 0 and len(self.generate_list) < self.max_num:#判断是否创建线程
self.generate_thread()
def close(self): #关闭线程函数
num = len(self.generate_list)
while num:
self.q.put(stop)
num -= 1
def terminal(self): #一个可以在任务没执行完的情况下强制终止的函数,
self.terminal = True# 根据 self.terminal判断
max_num = len(self.generate_list)
while max_num: #放入列表长度的个数的stop结束正在阻塞的进程
self.q.put(stop)
max_num -= 1#该方法清空了线程但是没清空队列任务 def terminall(self): # 一个可以在任务没执行完的情况下强制终止的函数,
self.terminal = True # 根据 self.terminal判断 while self.generate_list:#如果列表不为空就会不断放入sotp清空线程列表
self.q.put(stop)
self.q.empty()#线程清空完毕之后清空队列,完美。
def work(a): #以下为示例
print(a)
pool = Thread(10)
for i in range(50):
pool.run(func=work,args=i)
pool.close()
一个python线程池的源码解析的更多相关文章
- linux线程池thrmgr源码解析
linux线程池thrmgr源码解析 1 thrmgr线程池的作用 thrmgr线程池的作用是提高程序的并发处理能力,在多CPU的服务器上运行程序,可以并发执行多个任务. 2 ...
- Java并发包源码学习系列:线程池ScheduledThreadPoolExecutor源码解析
目录 ScheduledThreadPoolExecutor概述 类图结构 ScheduledExecutorService ScheduledFutureTask FutureTask schedu ...
- Java并发包源码学习系列:线程池ThreadPoolExecutor源码解析
目录 ThreadPoolExecutor概述 线程池解决的优点 线程池处理流程 创建线程池 重要常量及字段 线程池的五种状态及转换 ThreadPoolExecutor构造参数及参数意义 Work类 ...
- 【Java并发编程】21、线程池ThreadPoolExecutor源码解析
一.前言 JUC这部分还有线程池这一块没有分析,需要抓紧时间分析,下面开始ThreadPoolExecutor,其是线程池的基础,分析完了这个类会简化之后的分析,线程池可以解决两个不同问题:由于减少了 ...
- ThreadPoolExecutor 线程池的源码解析
1.背景介绍 上一篇从整体上介绍了Executor接口,从上一篇我们知道了Executor框架的最顶层实现是ThreadPoolExecutor类,Executors工厂类中提供的newSchedul ...
- Python线程池ThreadPoolExecutor源码分析
在学习concurrent库时遇到了一些问题,后来搞清楚了,这里记录一下 先看个例子: import time from concurrent.futures import ThreadPoolExe ...
- 深入浅出Java线程池:源码篇
前言 在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用.(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适).本文则深入线程池的源码,主要是介绍Thr ...
- java线程池ThreadPoolExector源码分析
java线程池ThreadPoolExector源码分析 今天研究了下ThreadPoolExector源码,大致上总结了以下几点跟大家分享下: 一.ThreadPoolExector几个主要变量 先 ...
- Java核心复习——线程池ThreadPoolExecutor源码分析
一.线程池的介绍 线程池一种性能优化的重要手段.优化点在于创建线程和销毁线程会带来资源和时间上的消耗,而且线程池可以对线程进行管理,则可以减少这种损耗. 使用线程池的好处如下: 降低资源的消耗 提高响 ...
随机推荐
- AIX下tar解包问题
今天,在AIX下安装tomcat,上传的版本是apache-tomcat-6.0.41.tar.gz,但用tar解压时出现以下问题: # tar xvf apache-tomcat-6.0.41.ta ...
- 云计算之路-阿里云上:消灭“黑色n秒”第三招——禁用网卡的TCP/IP Offload
程咬金有三板斧,我们有三招.在这篇博文中我们要出第三招,同时也意味着昨天在“希望的田野”上的第二招失败了. 前两招打头(CPU)不凑效,这一招要换一个部位,但依然要坚持攻击敌人最弱(最忙最累)部位的原 ...
- Greenplum 数据库安装部署(生产环境)
Greenplum 数据库安装部署(生产环境) 硬件配置: 16 台 IBM X3650, 节点配置:CPU 2 * 8core,内存 128GB,硬盘 16 * 900GB,万兆网卡. 万兆交换机. ...
- [C] C++对C的部分扩充
C语言只允许变量在程序(或函数)开始处定义,而C++允许变量在程序的任何位置定义. C语言中没有定义作用域限定运算符. C语言中没有布尔类型. C++中关于枚举类型和结构类型的定义更加简洁. C++新 ...
- 分享一个Jquery 分页插件 Jquery Pagination
分页插件来说,我觉得适用就行,尽量简单然后能够根据不同的应用场景能够换肤.展现形式等. 对于初学者想写分页插件的同学,也可以看下源码,代码也挺简单明了的,也助于自己写个小插件. 不过我比较懒,一般直接 ...
- Mac删除JDK
安装了1.6以后,没有安装1.7发现Android Studio报错: invalid source release: JDK 1.7 原因是Android Studio需要1.7以上的版本,结果再次 ...
- Pentaho Kettle 6.1连接CDH5.4.0集群
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 欢迎转载 最近把之前写的Hadoop MapReduce程序又总结了下,发现很多逻辑基本都是大致相同的,于是想到 ...
- [New Portal]Windows Azure Virtual Machine (18) Azure Virtual Machine内部IP和外部IP
<Windows Azure Platform 系列文章目录> 在开始本章内容之前,请读者熟悉以下2篇博文: [New Portal]Windows Azure Virtual ...
- Azure Automation (2) 定期删除存储账号中的文件
<Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. 本文是对笔者之前的文档Azure Backup (1) 将SQL ...
- web项目中,视图层中关于相对路径和绝对路径
1.在jfinal项目中 因为一直使用的jfinal,没感觉路径问题. 举个栗子,项目名字叫做test.访问一个Controller的映射为/user/add.这样,在浏览器地址栏直接:localho ...