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. pta 编程题8 Tree Traversals Again

    其它pta数据结构编程题请参见:pta 这次的作业考察的是树的遍历. 题目的输入通过栈的pop给出了树的中序遍历的顺序.根据push和pop的顺序构造树的方法为:定义一个变量father来确定父节点, ...

  2. 安装CocoaPods遇到的问题 及其解决

    本人也是第一次安装这个 CocoaPods,所以刚开始也是遇到了很多懵逼的问题,今天终于搞定了,就自己总结一下,如有错误敬请指出,谢谢! 由于之前,对于终端命令行,不是很了解,总感觉很麻烦,所以也一直 ...

  3. 使用dotnet-dump 查找 .net core 3.0 占用CPU 100%的原因

    公司的产品一直紧跟 .net core 3.0 preview 不断升级, 部署到 Linux 服务器后, 偶尔会出现某个进程CPU占用100%. 由于服务部署在云上, 不能使用远程调试; 在局域网内 ...

  4. .NET AJAX实例

    引用地址:http://blog.csdn.net/qianjiu/article/details/7524228 5.2 Ajax基础http://book.csdn.net/bookfiles/6 ...

  5. Mybatis自查询递归查找子

    先看一下数据库 主键id,名称product_code,父parent,和kind 设计菜单类 setter,getter Dao public interface ProductMapper { L ...

  6. C#冒泡排序程序

    考虑到很多面试可能会考察冒泡排序的用法,所以特地花时间厘清了一下思路.下面说一下我的思路:冒泡排序核心就是比较方法,冒泡排序的比较方法顾名思义就是像气泡一样,最大(或者最小)的数往上冒.普通比较几个数 ...

  7. 洛谷P3371单源最短路径Dijkstra版(链式前向星处理)

    首先讲解一下链式前向星是什么.简单的来说就是用一个数组(用结构体来表示多个量)来存一张图,每一条边的出结点的编号都指向这条边同一出结点的另一个编号(怎么这么的绕) 如下面的程序就是存链式前向星.(不用 ...

  8. html +css 登陆框中加用户图片,并设置登陆名不盖住图标

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 1- vue django restful framework 打造生鲜超市

    Vue+Django REST framework实战 使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支 ...

  10. node实现一个简单的聊天室(认识一下socket)

    边学边理解node的高深,今天写了一个聊天室的demo,很简单,认识一下socket node服务端代码 var express = require('express'); var app = exp ...