基于简单版创建类对象过多,现自定义高级版python线程池,代码如下

 #高级线程池
import queue
import threading
import time
StopEvent = object() #全局变量当作取任务时的停止标志只要不是元组就可以
class ThreadPool(object):
def __init__(self,max_num):
self.q = queue.Queue() #创建无数个队列
self.max_num = max_num #线程池最大数
self.generate_list = [] #创建的线程
self.free_list = [] #空闲的线程
self.terminal = False def run(self,func,args,callback=None):
self.q.put((func,args,callback)) #添加任务组,任务放队列
if len(self.free_list) == 0 and len(self.generate_list) < self.max_num:#没空闲线程并且已创建的线程小于最大线程
self.generate_thread()#创建线程
def generate_thread(self):
threading.Thread(target=self.call).start()
def call(self): #一直队列取任务包执行
current_thread = threading.currentThread #获取当前线程
self.generate_list.append(current_thread) #把当前线程加到创建的线程列表
event = self.q.get()#从列表取任务
while event != StopEvent:#取得不是特殊数据类型,那取得就是任务
func,args,callback = event #解任务包
#以下是执行func函数
status = True
try:
ret = func(args)#执行任务
except Exception as e:
ret = e
status = False
if callback == None:
pass
else:
callback(status,ret)#执行回调函数
if self.terminal:#False 改成True后移出generate_list 就把线程终止了,python回收垃圾机制会回收
event = StopEvent
else:#默认执行以下
self.free_list.append(current_thread) #把当前线程加入到空闲线程列表
event = self.q.get()#取任务
self.free_list.remove(current_thread)#取到任务后从空闲线程列表移除一个线程 else: #是StopEvent 也就是取得不是任务包
self.generate_list.remove(current_thread) #不是任务,移除创建得线程列表等待python回收
def terminate(self):#不获取任务包了,终止线程不清空队列
self.terminal = True
#等着获取任务得线程结束
max_num = len(self.generate_list)
while max_num:
self.q.put(StopEvent)
max_num -= 1 def close(self):#放StopEvent,
generate_list_num = len(self.generate_list)
while generate_list_num:
self.q.put(StopEvent)
generate_list_num -= 1 def work(i): print(i)
pool = ThreadPool(10) #最大线程数是5
for i in range(50):
pool.run(work,(i))
time.sleep(0.01)
pool.terminate()
# pool.close()

自定义高级版python线程池的更多相关文章

  1. 自定义简单版本python线程池

    python未提供线程池模块,在python3上用threading和queue模块自定义简单线程池,代码如下: #用threading queue 做线程池 import queue import ...

  2. 对Python线程池

    本文对Python线程池进行详细说明介绍,IDE选择及编码的解决方案进行了一番详细的描述,实为Python初学者必读的Python学习经验心得. AD: 干货来了,不要等!WOT2015 北京站演讲P ...

  3. Python 线程池(小节)

    Python 线程池(小节) from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import os,time, ...

  4. python线程池ThreadPoolExecutor(上)(38)

    在前面的文章中我们已经介绍了很多关于python线程相关的知识点,比如 线程互斥锁Lock / 线程事件Event / 线程条件变量Condition 等等,而今天给大家讲解的是 线程池ThreadP ...

  5. python线程池及其原理和使用

    python线程池及其原理和使用 2019-05-29 17:05:20 whatday 阅读数 576 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很 ...

  6. python线程池示例

    使用with方式创建线程池,任务执行完毕之后,会自动关闭资源 , 否则就需要手动关闭线程池资源  import threading, time from concurrent.futures impo ...

  7. Python线程池与进程池

    Python线程池与进程池 前言 前面我们已经将线程并发编程与进程并行编程全部摸了个透,其实我第一次学习他们的时候感觉非常困难甚至是吃力.因为概念实在是太多了,各种锁,数据共享同步,各种方法等等让人十 ...

  8. [python] 线程池

    特别感谢simomo 什么是线程池? 诸如web服务器.数据库服务器.文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务.构建服务器应用程序的一个过于简单的模型是:每当一 ...

  9. Python 线程池的原理和实现及subprocess模块

    最近由于项目需要一个与linux shell交互的多线程程序,需要用python实现,之前从没接触过python,这次匆匆忙忙的使用python,发现python确实语法非常简单,功能非常强大,因为自 ...

随机推荐

  1. 同一域名基于源ip地址分配给不同ip的dns配置--bind9.8.2

    1.安装bind.略. 2./etc/named.conf配置文件. // named.conf // // Provided by Red Hat bind package to configure ...

  2. 跟着刚哥学习Spring框架--通过XML方式配置Bean(三)

    Spring配置Bean有两种形式(XML和注解) 今天我们学习通过XML方式配置Bean 1. Bean的配置方式 通过全类名(反射)的方式   √ id:标识容器中的bean.id唯一. √ cl ...

  3. Freemarker实例教程

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任.作者:永恒の_☆ 地址:http://blog.csdn.net/chenghui0317/a ...

  4. Swift5 语言指南(二十八) 高级运算符

    除了Basic Operators中描述的运算符之外,Swift还提供了几个执行更复杂值操作的高级运算符.这些包括C和Objective-C中您熟悉的所有按位和位移运算符. 与C中的算术运算符不同,S ...

  5. 机器学习基石笔记:16 Three Learning Principles

    三个理论上界: 三个线性模型: 三个关键工具: 三条学习规则: 1.奥卡姆剃刀定律 先从简单模型开始, 训练后出现欠拟合, 再尝试复杂点模型. 2.采样误差 训练.验证.测试数据尽量同分布. 3.数据 ...

  6. (转)每天一个linux命令(21):find命令之xargs

    原文:http://www.cnblogs.com/peida/archive/2012/11/15/2770888.html https://blog.csdn.net/ly1358152944/a ...

  7. Attr的visitNewClass()方法解读

    在visitNewClass()方法中有如下注释: We are seeing an anonymous class instance creation.In this case, the class ...

  8. 计数排序/Counting Sort

    计数排序的算法思想: 对于每一个元素x,只要确定了元素x有多少个比它小的元素,那么就可以知道其最终的位置. 记输入数组为A[n],存放最后排序输出的数组为B[n],提供临时存储空间的中间数组记为C[k ...

  9. [Python学习笔记-002] lambda, map, filter and reduce

    1. lambda lambda, 即匿名函数,可以理解为跟C语言的宏类似.例如: >>> max = lambda x, y: x if x > y else y >& ...

  10. HTML Dog 初级教程中关于 forms 的翻译

    Formsforms用于搜集用户输入网页上的信息.它们可以当作网络应用的接口,或者用于发送网络数据. 仅仅使用forms,它们并不那么有用.它们通常结合某种编程语言来处理用户输入的数据.HTML中使用 ...