自定义高级版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确实语法非常简单,功能非常强大,因为自 ...
随机推荐
- 如何在vue中全局引入stylus文件的公共变量
新建 一个公共的stylus公共文件添加公共变量,如下: 修改下图圈出的文件: 具体的修改如下: // generate loader string to be used with extract t ...
- [转载]windows下安装Python虚拟环境virtualenv,virtualenvwrapper-win
1 前言 由于Python的版本众多,还有Python2和Python3的争论,因此有些软件包或第三方库就容易出现版本不兼容的问题. 通过 virtualenv 这个工具,就可以构建一系列 虚拟的Py ...
- C# 单元测试(入门)
注:本文示例环境 VS2017XUnit 2.2.0 单元测试框架xunit.runner.visualstudio 2.2.0 测试运行工具Moq 4.7.10 模拟框架 什么是单元测试? 确保软件 ...
- POJ 2501
#include<iostream> #include<iomanip> #include<stdio.h> #include<string> #inc ...
- WebForm——JS检测浏览器是否是IE浏览器
function IEVersion() { var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 && userAgen ...
- 在matlab中实现梯度下降法
梯度下降法的原理,本文不再描述,请参阅其它资料. 梯度下降法函数function [k ender]=steepest(f,x,e),需要三个参数f.x和e,其中f为目标函数,x为初始点,e为终止误差 ...
- eclipse下搭建shell脚本编辑器--安装开发shell的eclipse插件shelled
具体请看: 亲测有效: http://www.cnblogs.com/shellshell/p/6122811.html
- Mac下安装Eclipse和Tomcat等
Mac下做Java开发还是很方便的,不用像.NET开发一样在Parallel Desktop里面安装Windows虚拟机,Mac下面默认已经安装了JDK. 当然,你如果要安装JDK7,请先阅读:htt ...
- 【云和恩墨】性能优化:Linux环境下合理配置大内存页(HugePage)
原创 2016-09-12 熊军 [云和恩墨]性能优化:Linux环境下合理配置大内存页(HugePage) 熊军(老熊) 云和恩墨西区总经理 Oracle ACED,ACOUG核心会员 PC S ...
- WebMagic实现分布式抓取以及断点抓取
访问我的博客 前言 从去年到今年,笔者主要负责的是与合作方的内容对接,新增的合作商不是很多的情况下,在我自从去年引入了 WebMagic 这个爬虫框架之后,基本很少需要去关注维护爬虫,做的最多的是新接 ...