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. http请求头和相应头的作用

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

  2. Java后台工程师的3次面试

    第一次面试 我面的是一个中小公司,在BOSS直聘上面找的,去之前看了看关于Java的一些基础知识,在牛客网上面看的,也做了一下牛客网的题目.然后跟HR约了一个时间就去面试了.因为第一次面试,一点经验都 ...

  3. Jquery-EasyUI combobox下拉框使用

    制作一个json文件: <input data-options="url:'${pageContext.request.contextPath }/json/combobox_data ...

  4. Bootstrap历练实例:按钮(Button)插件单个切换

    单个切换 如需激活单个按钮的切换(即改变按钮的正常状态为按压状态,反之亦然),只需向 button 元素添加 data-toggle="button" 作为其属性即可,如下面实例所 ...

  5. el-upload控件一次接口请求上传多个文件

    el-upload组件默认情况下上传多少个文件就会请求多少次上传接口,如何一次上传多个文件而不必多次请求上传接口呢?直接看代码 html <el-upload :action="act ...

  6. STL笔记(に)--vector容器

    Vector 1.可变长的动态数组 2.需包含头文件#include<vector> (当然,如果用了万能头文件#include<bits/stdc++.h>则可忽略) 3.支 ...

  7. 分享一个漂亮按钮插件FancyButtons

    一转眼,2018年的第10天就这样过去了.回看17年,曾经做了些啥都忘记了,就像每一天写日志时的样子(双手放在键盘上,怒着嘴,抬着头,望着天花板), 然后突然记得好像好久没有写随笔了(@_@).自从配 ...

  8. 该网页无法正常运作 目前无法处理此请求HTTP ERROR 500?

    由于php.ini配置文件中错误显示关闭导致. 将下值由Off 变更为 On display_errors = On display_startup_errors = On

  9. selinux详解及配置文件

    selinux详解 selinux 的全称是Security Enhance Linux,就是安全加强的Linux.在Selinux之前root账号能够任意的访问所有文档和服务 : 如果某个文件设为7 ...

  10. DC84问

    1.1 什么是DC?DC(Design Compiler)是Synopsys公司的logical synthesis工具,它根据design description和design constraint ...