Python之实现不同版本线程池
1、利用queue和threading模块可以实现多个版本的线程池,这里先贴上一个简单的
import queue
import time import threading class ThreadPool(object):
def __init__(self,max_num = 20):#默认最大20个线程
self.queue=queue.Queue(max_num)
for i in range(max_num):#将20个线程类名放进队列
self.queue.put(threading.Thread) def get_thread(self):#获取线程,没有的话会在这里等待
return self.queue.get() def add_thread(self):#添加线程
self.queue.put(threading.Thread) p = ThreadPool() def f1(p,args):
time.sleep(1)
print(args)
p.add_thread()#函数执行完毕之后,自动添加线程回池
for i in range(100):
ret=p.get_thread()#获得线程类名
t = ret(target=f1,args=(p,i))#准备启动线程
t.start()#启动线程
但是这个版本是一开始就创建了所有出线程池,浪费内存,线程也没有重复利用,下面的代理池解决了这个问题,有需要才创建,且重复利用空闲线程
2、高级版线程池
import queue
import time import threading StopEvent = []
class ThreadPool():
def __init__(self,max_num):
self.max_num = max_num#最多创建的线程数
self.generate_list = []#真实创建的线程数
self.free_list=[]
self.q=queue.Queue()
def run(self,func,args,callback=None): data = (func,args,callback)#将任务封装进一个元组
self.q.put(data)#将任务放进队列
if len(self.free_list) ==0 and len(self.generate_list) < self.max_num:
self.work(data) def work(self,data): thread = threading.Thread(target=self.call)#创建线程
thread.start()
def call(self):
current_thread = threading.currentThread
self.generate_list.append(current_thread)#把现有的线程添加进去 job = self.q.get()#去队列里面领取任务
while job != StopEvent:
func, args, callback = job
try:#执行任务
ret = func(args)
except Exception as e:
print(e)
else:#如果有回调函数则执行
if callback:
callback()
else:pass self.free_list.append(current_thread)#任务执行完成则添加进空闲线程
job = self.q.get()
self.free_list.remove(current_thread)#获得了任务则从空闲列表中去除 else:
self.generate_list.remove(current_thread)#清除该线程,让Python垃圾回收机制处理 def close(self):
for itme in range(len(self.generate_list)):
self.q.put(StopEvent) def f1(args):
#time.sleep(0.5)
print(args) pool= ThreadPool(10)
for i in range(50):
pool.run(func=f1,args=(i,)) #time.sleep(5)
print(len(pool.generate_list))
pool.close()
执行结果如图

Python之实现不同版本线程池的更多相关文章
- Python SSH爆破以及Python3线程池控制线程数
源自一个朋友的要求,他的要求是只爆破一个ip,结果出来后就停止,如果是爆破多个,完全没必要停止,等他跑完就好 #!usr/bin/env python #!coding=utf-8 __author_ ...
- python第五课——自定义线程池
内容概要: 1.low版线程池 2.绝版线程池 1.low版线程池 设计思路:运用队列queue 将线程类名放入队列中,执行一个就拿一个出来 import queue import threading ...
- Python中为什么要使用线程池?如何使用线程池?
系统处理任务时,需要为每个请求创建和销毁对象.当有大量并发任务需要处理时,再使用传统的多线程就会造成大量的资源创建销毁导致服务器效率的下降.这时候,线程池就派上用场了.线程池技术为线程创建.销毁的开销 ...
- Python的线程池
#!/usr/bin/env python # -*- coding: utf-8 -*- """ concurrent 用于线程池和进程池编程而且更加容易,在Pytho ...
- Python 多线程和线程池
一,前言 进程:是程序,资源集合,进程控制块组成,是最小的资源单位 特点:就对Python而言,可以实现真正的并行效果 缺点:进程切换很容易消耗cpu资源,进程之间的通信相对线程来说比较麻烦 线程:是 ...
- Python线程池及其原理和使用(超级详细)
系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 线程池在系统启动时即 ...
- python线程池及其原理和使用
python线程池及其原理和使用 2019-05-29 17:05:20 whatday 阅读数 576 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很 ...
- Python多线程、线程池及实际运用
我们在写python爬虫的过程中,对于大量数据的抓取总是希望能获得更高的速度和效率,但由于网络请求的延迟.IO的限制,单线程的运行总是不能让人满意.因此有了多线程.异步协程等技术. 下面介绍一下pyt ...
- asp.net core C#设计一个实用的线程池
菜菜呀,我最近研究技术呢,发现线上一个任务程序线程数有点多呀 CEO,CTO,CFO于一身的CXO x总,你学编程呢? 菜菜 作为公司总负责人,我以后还要管理技术部门呢,怎么能不会技术呢 CEO,CT ...
随机推荐
- 微信jssdk实现分享到微信
本来用的是这个插件http://overtrue.me/share.js/和百度分享 相同之处:在微信分享的时候,分享的链接都不能获取到缩略图... 不同之处:百度分享在微信低版本是可以看到缩略图的( ...
- linux 命令——2 cd (转)
Linux cd 命令可以说是Linux中最基本的命令语句,其他的命令语句要进行操作,都是建立在使用 cd 命令上的. 所以,学习Linux 常用命令,首先就要学好 cd 命令的使用方法技巧. 1. ...
- IOS tableView 去除分割线 和 不允许选中表格cell
//去除分割线 self.tableView.backgroundColor=[UIColor colorWithRed:///255.0 alpha:1.0]; self.tableView.sep ...
- hdu-3371 Connect the Cities---kruskal
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3371 题目大意: 给n个城市,m条路,k组已知路,求最小费用联通所有城市: 解题思路: kruska ...
- 【51nod1299】监狱逃离(树形DP)
点此看题面 大致题意: 在一棵树中有\(N\)条边连接\(N+1\)个节点,现在已知这棵树上的\(M\)个节点,要求封住最少的节点,使这\(M\)个节点中的任意一个节点无法到达叶子节点,若能办到输出最 ...
- 在ListView控件中实现修改功能
实现效果: 知识运用: ListView控件的LabelEdit属性 //指示用户是否可以编辑控件中数据项的标签 public bool LabelEdit{get;set;} 实现代码: priva ...
- .net core 2.2跨域session
不说废话,直奔主题! 使用场景:微服务.前后端已经跨域.又不得不使用session 使用session的好处:此处省略若干字...... 做法: 客户端:该怎么写就怎么写. 服务端: Startup类 ...
- 更改yum网易、阿里云的yum源
更改yum源为网易的. 首先备份/etc/yum.repos.d/CentOS-Base.repomv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos ...
- shell基础及变量符号
kernel主要的功能: 1.内存的管理 2.设备驱动程序 3.文件系统的管理 4.进程的管理 5.网络系统 vim /etc/profile.d/ profile(主配置文件) .d(子配置文件 ...
- javascript的基本类型和引用类型
一.基本类型和引用类型 基本的数据类型有5个:undefined,boolean,number,string,null ? 1 2 3 4 5 typeof null; //"object& ...