博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义高级版python线程池
阅读量:7093 次
发布时间:2019-06-28

本文共 2494 字,大约阅读时间需要 8 分钟。

基于简单版创建类对象过多,现自定义高级版python线程池,代码如下

1 #高级线程池 2 import queue 3 import threading 4 import time 5 StopEvent = object() #全局变量当作取任务时的停止标志只要不是元组就可以 6 class ThreadPool(object): 7     def __init__(self,max_num): 8         self.q = queue.Queue() #创建无数个队列 9         self.max_num = max_num #线程池最大数10         self.generate_list = [] #创建的线程11         self.free_list = [] #空闲的线程12         self.terminal = False13 14     def run(self,func,args,callback=None):15         self.q.put((func,args,callback)) #添加任务组,任务放队列16         if len(self.free_list) == 0 and len(self.generate_list) < self.max_num:#没空闲线程并且已创建的线程小于最大线程17             self.generate_thread()#创建线程18     def generate_thread(self):19         threading.Thread(target=self.call).start()20     def call(self): #一直队列取任务包执行21         current_thread = threading.currentThread #获取当前线程22         self.generate_list.append(current_thread) #把当前线程加到创建的线程列表23         event = self.q.get()#从列表取任务24         while event != StopEvent:#取得不是特殊数据类型,那取得就是任务25             func,args,callback = event #解任务包26             #以下是执行func函数27             status = True28             try:29                 ret = func(args)#执行任务30             except Exception as e:31                 ret = e32                 status = False33             if callback == None:34                 pass35             else:36                 callback(status,ret)#执行回调函数37             if self.terminal:#False 改成True后移出generate_list 就把线程终止了,python回收垃圾机制会回收38                 event = StopEvent39             else:#默认执行以下40                 self.free_list.append(current_thread) #把当前线程加入到空闲线程列表41                 event = self.q.get()#取任务42                 self.free_list.remove(current_thread)#取到任务后从空闲线程列表移除一个线程43 44         else: #是StopEvent 也就是取得不是任务包45             self.generate_list.remove(current_thread) #不是任务,移除创建得线程列表等待python回收46     def terminate(self):#不获取任务包了,终止线程不清空队列47         self.terminal = True48         #等着获取任务得线程结束49         max_num = len(self.generate_list)50         while max_num:51             self.q.put(StopEvent)52             max_num -= 153 54     def close(self):#放StopEvent,55         generate_list_num = len(self.generate_list)56         while generate_list_num:57             self.q.put(StopEvent)58             generate_list_num -= 159 60 def work(i):61 62     print(i)63 pool = ThreadPool(10) #最大线程数是564 for i in range(50):65      pool.run(work,(i))66 time.sleep(0.01)67 pool.terminate()68 # pool.close()
View Code

 

转载于:https://www.cnblogs.com/wenxianfeng/p/9997437.html

你可能感兴趣的文章
MYSQL的存储过程和函数简单写法
查看>>
acdream1197 Points In Cuboid
查看>>
topcoder srm 390 div1
查看>>
无法远程链接sqlserver的解决办法
查看>>
WinRT比.NET快了,还是Win8比Win7快
查看>>
SecureCRT 字体 颜色 修改 背景色 键盘映射 Home end delete
查看>>
【内核】Linux 2.6 内存反向映射机制 Reverse Mapping
查看>>
jQuery实现删除option控件下的元素
查看>>
Qt中translate、tr关系 与中文问题
查看>>
反射的两个过滤枚举
查看>>
Android编程之常识 - 混淆
查看>>
源码分析六(org.springframework.util包之Assert类)
查看>>
源码分析八(org.springframework.util包之StringUtils类))
查看>>
#include<> 和 #include""的区别
查看>>
【转】最近很火的 Safe Area 到底是什么
查看>>
java EE 环境配置(JDK + Tomcat + Eclipse for java EE)
查看>>
【转】【Python】Python正则表达式使用指导
查看>>
c#去掉guid中间的横杆
查看>>
使用Data Annotations进行手动数据验证
查看>>
php 禁止 URL 直接访问 php文件
查看>>