基于简单版创建类对象过多,现自定义高级版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. Spring Boot日志管理

    SpringBoot内部使用Commons Logging来记录日志,但是默认也提供了对常用日志组件的支持,如:Log4j,Logback等.每种Logger都可以通过配置使用控制台或者文件输出日志内 ...

  2. SpringCloud之Ribbon

    一:Ribbon是什么?  Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连 ...

  3. Shell - 简明Shell入门11 - 调用脚本(CallTheScript)

    示例脚本及注释 主脚本: CallTheScript.sh #!/bin/bash . ./11-subscript.sh # 调用其他脚本;注意点号"."和文件路径之间有一空格; ...

  4. node.js中的回调

    同步和阻塞:这两个术语可以互换使用,指的是代码的执行会在函数返回之前停止.如果某个操作阻塞,那么脚本就无法继续,这意味着必须等待. 异步和非阻塞:这两个术语可以互换使用,指的是基于回调的.允许脚本并行 ...

  5. [视频]youku与56客户端DLL却持

    [视频]youku与56客户端DLL却持 https://pan.baidu.com/s/1c1ArnOk

  6. django views视图函数返回值 return redirect httpresponse总结

    django views视图函数返回值 return redirect  render httpresponse总结

  7. 只用一招,让你Maven依赖下载速度快如闪电

    一.背景 众所周知,Maven对于依赖的管理让我们程序员感觉爽的不要不要的,但是由于这货是国外出的,所以在我们从中央仓库下载依赖的时候,速度如蜗牛一般,让人不能忍,并且这也是大多数程序员都会遇到的问题 ...

  8. 单例模式——java设计模式

    单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图               ...

  9. 从Java进程里dump出类的字节码文件

    想要查看一些被增强过的类的字节码,或者一些AOP框架的生成类,就需要dump出运行时的Java进程里的字节码. 从运行的java进程里dump出运行中的类的class文件的方法: 用agent att ...

  10. CentOS Java C JNI

    使用JNI调用本地代码,整个开发流程主要包括以下几个步骤: 1.创建一个Java类(IntArray.java): 2.使用javac编译该类(生成IntArray.class): 3.使用javah ...