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线程池的源码解析的更多相关文章

  1. linux线程池thrmgr源码解析

    linux线程池thrmgr源码解析 1         thrmgr线程池的作用 thrmgr线程池的作用是提高程序的并发处理能力,在多CPU的服务器上运行程序,可以并发执行多个任务. 2      ...

  2. Java并发包源码学习系列:线程池ScheduledThreadPoolExecutor源码解析

    目录 ScheduledThreadPoolExecutor概述 类图结构 ScheduledExecutorService ScheduledFutureTask FutureTask schedu ...

  3. Java并发包源码学习系列:线程池ThreadPoolExecutor源码解析

    目录 ThreadPoolExecutor概述 线程池解决的优点 线程池处理流程 创建线程池 重要常量及字段 线程池的五种状态及转换 ThreadPoolExecutor构造参数及参数意义 Work类 ...

  4. 【Java并发编程】21、线程池ThreadPoolExecutor源码解析

    一.前言 JUC这部分还有线程池这一块没有分析,需要抓紧时间分析,下面开始ThreadPoolExecutor,其是线程池的基础,分析完了这个类会简化之后的分析,线程池可以解决两个不同问题:由于减少了 ...

  5. ThreadPoolExecutor 线程池的源码解析

    1.背景介绍 上一篇从整体上介绍了Executor接口,从上一篇我们知道了Executor框架的最顶层实现是ThreadPoolExecutor类,Executors工厂类中提供的newSchedul ...

  6. Python线程池ThreadPoolExecutor源码分析

    在学习concurrent库时遇到了一些问题,后来搞清楚了,这里记录一下 先看个例子: import time from concurrent.futures import ThreadPoolExe ...

  7. 深入浅出Java线程池:源码篇

    前言 在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用.(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适).本文则深入线程池的源码,主要是介绍Thr ...

  8. java线程池ThreadPoolExector源码分析

    java线程池ThreadPoolExector源码分析 今天研究了下ThreadPoolExector源码,大致上总结了以下几点跟大家分享下: 一.ThreadPoolExector几个主要变量 先 ...

  9. Java核心复习——线程池ThreadPoolExecutor源码分析

    一.线程池的介绍 线程池一种性能优化的重要手段.优化点在于创建线程和销毁线程会带来资源和时间上的消耗,而且线程池可以对线程进行管理,则可以减少这种损耗. 使用线程池的好处如下: 降低资源的消耗 提高响 ...

随机推荐

  1. Shader 简明入门教程

    Unity3D的所有渲染工作都离不开着色器(Shader),如果你和我一样最近开始对Shader编程比较感兴趣的话,可能你和我有着同样的困惑:如何开始?Unity3D提供了一些Shader的手册和文档 ...

  2. js中的一个方法怎么将数据主动传给另一个方法

    项目有这样的一个需求,一个不断接收实时数据的有返回值的js方法Function A在运行,同时我想将接收到的这些数据进行分解提取想要的部分并传给Function B.如何实现? Function A( ...

  3. 赞!15个来自 CodePen 的酷炫 CSS 动画效果

    CodePen 是一个在线的前端代码编辑和展示网站,能够编写代码并即时预览效果.你在上面可以在线分享自己的 Web 作品,也可以欣赏到世界各地的优秀开发者在网页中实现的各种令人惊奇的效果. 今天这篇文 ...

  4. 【Android】Android Camera原始帧格式转换 —— 获取Camera图像(一)

     概述: 做过Android Camera图像采集和处理的朋友们应该都知道,Android手机相机采集的原始帧(RawFrame)默认是横屏格式的,而官方API有没有提供一个设置Camera采集图像的 ...

  5. SQL Server时间粒度系列----第3节旬、月时间粒度详解

    本文目录列表: 1.SQL Server旬时间粒度2.SQL Server月有关时间粒度 3.SQL Server函数重构 4.总结语 5.参考清单列表   SQL Server旬时间粒度       ...

  6. 我读过的最好的epoll讲解--转自”知乎“

    首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. 不管是文件,还是套接字,还是管道,我们都可以把他们看作流. 之后我们来讨论I/O的操作,通过read ...

  7. 通过原生JS实现为元素添加事件

    自己写了一个为元素添加事件的方法,并封装到对象中. 说明: id : 目标元素的ID type: 事件的类型,注意的是不能加on fn:事件处理程序 isBubble :规定事件流 代码: var b ...

  8. asp.net网站优化经验之谈

    最近公司一个项目上线后,经常崩溃,于是开始重视性能问题,在网上看到了许多相关文章,整理下发了上来.以备参考. 在用ASP.NET开发网站的时候,性能是永远需要考虑和关注的问题,性能不仅仅只是程序代码执 ...

  9. 能分组的GridView

    有天在想工作上的事的时候,看着.net原有的DataGridView,想起以前我写过的一篇文章,总结了一个好的Gird控件应该具备哪些功能,在那里我提及到了分组功能,就像jqGrid那样, 其实这样的 ...

  10. 编写高性能SQL

    前言:系统优化中一个很重要的方面就是SQL语句的优化.对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可达到上百倍,可见对于一个系统不是简单的能实现其功能就可以了,而是要写出高质量的SQL语 ...