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. SQL*Loader之CASE1

    最近项目涉及到将文本文件中的数据导入到Oracle数据库中,故研究了下SQL*Loader,官档提供的资料不是很丰富,很多案例中出现的语句在官档中找不到出处.但它提供的案例本身却彰显出了SQL*Loa ...

  2. IIS 6中mimemap属性的默认设置

    Collapse this tableExpand this table Extension MIME type .ra audio/x-pn-realaudio .sv4crc applicatio ...

  3. Prim算法(二)之 C++详解

    本章是普里姆算法的C++实现. 目录 1. 普里姆算法介绍 2. 普里姆算法图解 3. 普里姆算法的代码说明 4. 普里姆算法的源码 转载请注明出处:http://www.cnblogs.com/sk ...

  4. tomcat实现ServletContext的addListener方法的源码解说(原创)

    tomcat 8.0.36 知识点: 动态监听器有七类: ServletContextAttributeListener ServletRequestListener ServletRequestAt ...

  5. 谈谈Android 6.0运行时权限理解

    前言 谷歌在2015年8月份时候,发布了Android 6.0版本,代号叫做“棉花糖”(Marshmallow ),其中的很大的一部分变化,是在用户权限授权上,或许是感觉之前默认授权的不合理,现在6. ...

  6. 自制简单的.Net ORM框架 (一) 简介

    在自己研究ORM之前,也使用过几个成熟的ORM方案,例如:EntityFramework,PetaPoco,Dapper 等,用是很好用,但是对自己来说总是不那么方便,EF比较笨重,Dapper要自定 ...

  7. html/css基础篇——DOM中关于脱离文档流的几种情况分析

    所谓的文档流,指的是元素排版布局过程中,元素会自动从左往右,从上往下的流式排列.并最终窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素.脱离文档流即是元素打乱了这个排列,或是从排版中拿走. ...

  8. JS的跳转

    需要在下面的button中实现跳转,之前直接写了个<a>标签,但是在手机上的效果太差了,这是老大写的 js跳转.记下来,要学会贯通. <div class="ps-lt&q ...

  9. DirectShowNet 使用摄像头录像+录音

    http://www.cnblogs.com/endv/p/6052511.html // ------------------------------------------------------ ...

  10. Nancy 学习-进阶部分 继续跨平台

    前面两篇,讲解Nancy的基础,及Nancy自宿主和视图引擎. 现在来学习一些进阶部分. Bootstrapper Bootstrapper 就相当于 asp.net 的Global.asax . 我 ...