自定义高级版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确实语法非常简单,功能非常强大,因为自 ...
随机推荐
- C# byte array 跟 string 互转
用 System.Text.Encoding.Default.GetString() 转换时,byte array 中大于 127 的数据转 string 时会出问题. 把这里的 Default 换成 ...
- java.lang.System.setProperty()方法实例
java.lang.System.setProperty() 方法设置指定键指定的系统属性. 声明 以下是java.lang.System.setProperty()方法的声明 public stat ...
- [JavaScript] 根据指定宽度截取字符串
/** * 根据指定宽度截取字符串 * @param desc 原始字符串 * @param width 该显示的宽度 * @param fontsize 字体大小 12px * @returns { ...
- cisco 的ACL
搞网络好几年了,怎么说呢,水平一直停留在NA-NP之间,系统的学完NA后,做了不少实验,后来也维护了企业的网络,各种网络设备都玩过(在商汤用的Juniper srx 550 我认为在企业环境,非IDC ...
- JS生成某个范围的随机数【四种情况详解】
JS没有现成的函数,能够直接生成指定范围的随机数. 但是它有个函数:Math.random() 这个函数可以生成 [0,1) 的一个随机数. 利用它,我们就可以生成指定范围内的随机数. 而涉及范围的 ...
- Mxonline3.6 在阿里云服务器上的部署(uwsgi nginx)
我的项目结构 1. 执行`python manage.py migrate`命令,将迁移文件,映射到数据库中,创建相应的表. 进入数据库 use mxonline数据库 source /hom ...
- Spring Boot 中使用 Jedis 及 Lettuce的对比
首先,同样的程序,采用不同方式的Redis连接方式. defautl : 默认,0配置 ,也就是走的是 lettuce 单通道方式. 端口:8081 jedis : 使用Jedis 连接池. ...
- Storm中的定时任务
1.全局定时器 import java.util.Map; import backtype.storm.Config; import backtype.storm.Constants; import ...
- python可变对象与不可变对象的差别
一.可变对象和不可对象 Python在heap中分配的对象分成两类:可变对象和不可对象.所谓可变对象是指,对象的内容可变,而不可变对象是指内容不可变. 不可变对象:int.string.float ...
- 对 Phantomjs / CasperJS 进行远程调试
CasperJS运行在PhantomJS之上,其实也是启用PhantomJS的远程调试功能 PhantomJS 是一个无图形界面的浏览器,它支持各种Web标准:DOM处理,CSS选择器,JSON,Ca ...