一个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源码分析
一.线程池的介绍 线程池一种性能优化的重要手段.优化点在于创建线程和销毁线程会带来资源和时间上的消耗,而且线程池可以对线程进行管理,则可以减少这种损耗. 使用线程池的好处如下: 降低资源的消耗 提高响 ...
随机推荐
- Kubernetes如何使用kube-dns实现服务发现
大纲: • Kubernetes中如何发现服务 • 如何发现Pod提供的服务 • 如何使用Service发现服务 • 如何使用kube-dns发现服务 ...
- PHP的学习--生成器Generators
生成器总览 (PHP 5 >= 5.5.0, PHP 7) 生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低. 生成器允 ...
- Kubernetes系统架构简介--转
原文地址:http://www.infoq.com/cn/articles/Kubernetes-system-architecture-introduction?utm_campaign=infoq ...
- 《HelloGitHub月刊》第05期
<HelloGitHub>第05期 兴趣是最好的老师,<HelloGitHub>就是帮你找到兴趣! 欢迎各路人士加入本项目,丰富月刊的内容,也可以直接在Issue(需要登录gi ...
- Windows Azure Web Site (7) Web Site配置
<Windows Azure Platform 系列文章目录> 在上一章内容中,我们已经部署了Azure WebSite.我们可以在Web Site配置页面进行配置.如下图: 另外,我们还 ...
- Elasticsearch聚合 之 Ip Range IP地址范围聚合
相对于range和date range,这个聚合就是能够表示IP的范围. 普通IP模式 DSL命令: { "aggs":{ "ip_ranges":{ &quo ...
- Moon.Orm 5.0(MQL版)使用指南及代码生成器新版发布
相关博文1)Moon.Orm 5.0 (MQL版) 配置说明; 2)Moon.Orm 5.0 (MQL版) 版本维护及下载(跟踪发布); 3)Moon.Orm 5.0系列文章; 4)Moon.Orm ...
- win10系统下点击关机却自动重启的问题解决思路
第一步.进入win10系统后,我们点击开始菜单上鼠标右键,选择控制面板 第二步.找到电源选项,点击进去(如何没发现,点击右上角查看方式,更换为小图标) 第三步.点击选择关闭盖子的功能 第四 ...
- 8.Fluent API in Code-First【Code-First系列】
在前面的章节中,我们已经看到了各种不同的数据注解特性.现在我们来学习一下Fluent API. Fluent API是另外一种配置领域类的方式,它提供了更多的配置相比数据注解特性. Mappings[ ...
- JavaScript基础—闭包,事件
Js基础-闭包,事件 1:js中的闭包 概念:在一个函数内部又定义了一个函数,内部函数能访问到外部函数作用域范围内的变量,这时这个内部函数就叫做闭包,无论这个内部函数在哪里被调用都能访问到外部函数作用 ...