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之实现不同版本线程池的更多相关文章

  1. Python SSH爆破以及Python3线程池控制线程数

    源自一个朋友的要求,他的要求是只爆破一个ip,结果出来后就停止,如果是爆破多个,完全没必要停止,等他跑完就好 #!usr/bin/env python #!coding=utf-8 __author_ ...

  2. python第五课——自定义线程池

    内容概要: 1.low版线程池 2.绝版线程池 1.low版线程池 设计思路:运用队列queue 将线程类名放入队列中,执行一个就拿一个出来 import queue import threading ...

  3. Python中为什么要使用线程池?如何使用线程池?

    系统处理任务时,需要为每个请求创建和销毁对象.当有大量并发任务需要处理时,再使用传统的多线程就会造成大量的资源创建销毁导致服务器效率的下降.这时候,线程池就派上用场了.线程池技术为线程创建.销毁的开销 ...

  4. Python的线程池

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ concurrent 用于线程池和进程池编程而且更加容易,在Pytho ...

  5. Python 多线程和线程池

    一,前言 进程:是程序,资源集合,进程控制块组成,是最小的资源单位 特点:就对Python而言,可以实现真正的并行效果 缺点:进程切换很容易消耗cpu资源,进程之间的通信相对线程来说比较麻烦 线程:是 ...

  6. Python线程池及其原理和使用(超级详细)

    系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 线程池在系统启动时即 ...

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

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

  8. Python多线程、线程池及实际运用

    我们在写python爬虫的过程中,对于大量数据的抓取总是希望能获得更高的速度和效率,但由于网络请求的延迟.IO的限制,单线程的运行总是不能让人满意.因此有了多线程.异步协程等技术. 下面介绍一下pyt ...

  9. asp.net core C#设计一个实用的线程池

    菜菜呀,我最近研究技术呢,发现线上一个任务程序线程数有点多呀 CEO,CTO,CFO于一身的CXO x总,你学编程呢? 菜菜 作为公司总负责人,我以后还要管理技术部门呢,怎么能不会技术呢 CEO,CT ...

随机推荐

  1. springMvc-视图模型封装及注解参数

    1.视图模型封装,ModelAndView可以向页面返回视图的同时吧模型也传入页面 2.注解参数,springMvc很好的地方在于简单,高效,@RequestParam注解能非常好的取得页面参数 代码 ...

  2. Windows Azure 入门 -- VS 2015部署 ASP.NET网站(项目) 与 数据库

    Windows Azure 入门 -- 部署 ASP.NET网站(项目) 与数据库 https://www.dotblogs.com.tw/mis2000lab/2015/12/24/windowsa ...

  3. http请求头和相应头的作用

    请求头(Request Headers) Accept:application/json, text/plain, */* Accept-Encoding:gzip, deflate Accept-L ...

  4. 【转】chrome浏览器的跨域设置——包括版本49前后两种设置

    做前后分离的webapp开发的时候,出于一些原因往往需要将浏览器设置成支持跨域的模式,好在chrome浏览器就是支持可跨域的设置,网上也有很多chrome跨域设置教程.但是新版本的chrome浏览器提 ...

  5. CentOS系统下安装Redis

    1. 安装C语言环境 yum install gcc-c++ 2.下载Redis安装包 http://download.redis.io/releases/redis-3.2.9.tar.gz 3.解 ...

  6. 版本管理工具-SourceSafe

    一.什么是SourceSafe SourceSafe是Micrsoft公司推出的一款支持团队协同开发的配置管理工具,是Visual Studio的套件之一.因为其短小精悍,又继承了微软集成销售的一贯作 ...

  7. 随机数生成器java实现

    /** 设计一个随机数生成器,可以产生给定平均概率的随机证书序列. 即输入一个概率比如:0.9 然后输入要求的概率样本个数比如:1000 输出一个接近所输入的0.9的概率数(要求样本数越大越接近输入的 ...

  8. MySQL - GROUP_CONCAT 使用方法

    如上图,我想把结果集中的三行链接成一行,则可这样写:   总结: GROUP_CONCAT函数默认是用','逗号链接,如果你加上第二个参数,则以',第二个参数值'逗号+第二个参数值链接,如下图     ...

  9. Linux 连接 Internet

    本文根据<鸟哥的Linux私房菜-服务器架设篇>第四章总结 Linux 连接 Internet 前的注意事项 想要连接 Internet 需要配置一组合法的 IP 参数,主要是 IP.Ne ...

  10. GBK UTF8 GB2132

    GBK就是在保存你的帖子的时候,一个汉字占用两个字节,外国人看会出现乱码,为此我中华为自己汉字编码而形成之解决方案. UTF8就是在保存你的帖子的时候,一个汉字占用3个字节.但是外国人看的话不会乱码. ...