自定义高级版python线程池
基于简单版创建类对象过多,现自定义高级版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线程池的更多相关文章
- 自定义简单版本python线程池
python未提供线程池模块,在python3上用threading和queue模块自定义简单线程池,代码如下: #用threading queue 做线程池 import queue import ...
- 对Python线程池
本文对Python线程池进行详细说明介绍,IDE选择及编码的解决方案进行了一番详细的描述,实为Python初学者必读的Python学习经验心得. AD: 干货来了,不要等!WOT2015 北京站演讲P ...
- Python 线程池(小节)
Python 线程池(小节) from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import os,time, ...
- python线程池ThreadPoolExecutor(上)(38)
在前面的文章中我们已经介绍了很多关于python线程相关的知识点,比如 线程互斥锁Lock / 线程事件Event / 线程条件变量Condition 等等,而今天给大家讲解的是 线程池ThreadP ...
- python线程池及其原理和使用
python线程池及其原理和使用 2019-05-29 17:05:20 whatday 阅读数 576 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很 ...
- python线程池示例
使用with方式创建线程池,任务执行完毕之后,会自动关闭资源 , 否则就需要手动关闭线程池资源 import threading, time from concurrent.futures impo ...
- Python线程池与进程池
Python线程池与进程池 前言 前面我们已经将线程并发编程与进程并行编程全部摸了个透,其实我第一次学习他们的时候感觉非常困难甚至是吃力.因为概念实在是太多了,各种锁,数据共享同步,各种方法等等让人十 ...
- [python] 线程池
特别感谢simomo 什么是线程池? 诸如web服务器.数据库服务器.文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务.构建服务器应用程序的一个过于简单的模型是:每当一 ...
- Python 线程池的原理和实现及subprocess模块
最近由于项目需要一个与linux shell交互的多线程程序,需要用python实现,之前从没接触过python,这次匆匆忙忙的使用python,发现python确实语法非常简单,功能非常强大,因为自 ...
随机推荐
- ASP.NETCore学习记录(二) —— ASP.NET Core 中间件
ASP.NET Core 中间件 目录: 什么是中间件 ? IApplicationBuilder 使用 IApplicationBuilder 创建中间件 Run.Map 与 Use 方法 实战中间 ...
- python连接mysql数据库简单例子
今天用pyhton2连接本地的mysql数据库,总的来说比较简单,但还是遇到一些小问题 代码如下: # -*- coding: utf-8 -*- import os import MySQLdb i ...
- c++处理类型与自定义数据结构
1.typedef 类型别名 有时我们在阅读c++程序时,发现一些未见过的类型,这实际上就是typedef导致的,使用很简单,如下: typedef int wayne; wayne a = , b ...
- asp.net core web 添加角色管理
新建asp.net core web应用 添加RolesAdminController [Authorize(Roles = "Admin")] public class Role ...
- Java之装饰模式
1.装饰模式的理解 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 2.装饰模式由4种角色组成 (1)抽象构件(Componen ...
- 读书笔记(03) - 性能 - JavaScript高级程序设计
作用域链查找 作用域链的查找是逐层向上查找.查找的层次越多,速度越慢.随着硬件性能的提升和浏览器引擎的优化,这个慢我们基本可以忽略. 除了层级查找损耗的问题,变量的修改应只在局部环境进行,尽量避免在局 ...
- Maven install [WARNING] The artifact aspectj:aspectjrt:jar:1.5.4 has been relocated to org.aspectj:aspectjrt:jar:1.5.4
一.背景 最近在给项目打包的时候,在控制台老是出现一行警告:[WARNING] The artifact aspectj:aspectjrt:jar:1.5.4 has been relocated ...
- mycat ER 分片表
<table name="order" dataNode="dn$1-32" rule="mod-long"> <chil ...
- Andrew Ng机器学习课程笔记(三)之正则化
Andrew Ng机器学习课程笔记(三)之正则化 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7365475.html 前言 ...
- Java中的八大基本数据类型
Java中的基本类型主要包括整数.浮点数.字符和布尔类型. 整数: 整数类型主要包括byte.short.int.long四种类型,所占大小分别为1byte.2byte.4byte和8byte: 浮点 ...