zoukankan      html  css  js  c++  java
  • 自定义高级版python线程池

    基于简单版创建类对象过多,现自定义高级版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 = False
    13 
    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 = True
    28             try:
    29                 ret = func(args)#执行任务
    30             except Exception as e:
    31                 ret = e
    32                 status = False
    33             if callback == None:
    34                 pass
    35             else:
    36                 callback(status,ret)#执行回调函数
    37             if self.terminal:#False 改成True后移出generate_list 就把线程终止了,python回收垃圾机制会回收
    38                 event = StopEvent
    39             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 = True
    48         #等着获取任务得线程结束
    49         max_num = len(self.generate_list)
    50         while max_num:
    51             self.q.put(StopEvent)
    52             max_num -= 1
    53 
    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 -= 1
    59 
    60 def work(i):
    61 
    62     print(i)
    63 pool = ThreadPool(10) #最大线程数是5
    64 for i in range(50):
    65      pool.run(work,(i))
    66 time.sleep(0.01)
    67 pool.terminate()
    68 # pool.close()
    View Code
  • 相关阅读:
    利用Python和webhook实现自动提交代码
    Python threading 单线程 timer重复调用函数
    Python requests 使用心得
    openresty实现接口签名安全认证
    使用jedis面临的非线程安全问题
    记一次线上升级openresty中kafka版本产生的多版本兼容问题
    mysql中走与不走索引的情况汇集(待全量实验)
    Elasticsearch深分页以及排序查询问题
    IO多路复用:Redis中经典的Reactor设计模式
    Netty在Dubbo中的使用过程源码分析
  • 原文地址:https://www.cnblogs.com/wenxianfeng/p/9997437.html
Copyright © 2011-2022 走看看