python之线程池

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-07 07:48:05
#!/user/bin/evn python
# -*- coding:utf-8 -*-

import threading
import queue,time

'''
线程池的思路:
将任务依次放在队列里面
然后从队列取出任务交给线程执行
'''
stopEvent=object()#任务完了的标志---下面我们将任务包封装到元组中
class ThreadPool(object):
    def __init__(self,max_num):
        #创建队列
        self.q=queue.Queue()
        #创建线程最大的数量(线程池的最大容量)
        self.max_num=max_num
        #空闲线程列表(数量)
        self.free_list=[]
        #真实创建的线程列表(数量)
        self.gemerate_list=[]
        #中断任务标志
        self.terminal=False

        self.num=0
    def run(self,func,args,callback=None):

        #func:任务函数
        #args:任务函数的参数
        #callback:线程执行成功或者失败后执行的回调函数
        task=(func,args,callback)#将任务封装到元组中 ==任务包
        #将任务包放到队列中
        self.q.put(task)
        #创建线程
        if len(self.free_list)==0 and len(self.gemerate_list)<self.max_num :
            self.generate_thread()


    #创建线程
    def generate_thread(self):
        #创建一个线程
        t=threading.Thread(target=self.call)
        t.start()

    def call(self):
        '''
        循环去获取任务函数并执行任务函数
        '''
        #获取当前线程
        current_thread=threading.currentThread
        #将当前线程添加到列表中
        self.gemerate_list.append(current_thread)

        #获取任务
        Event=self.q.get()

        while Event!=stopEvent :#表示是任务
            #分解任务包
            func,args,callable=Event
            status=True #标志执行成功
            try:
                 #执行任务
                ret=func(*args)
            except Exception as e:
                status=False
                ret=e
            #执行回调函数callback
            if callback==None:
                pass
            else:
                callback(status,ret)

            if self.terminal :#不终止任务
                Event=stopEvent
            else:
                #标记:我空闲了
                self.free_list.append(current_thread)
                #再从队列去取任务
                Event=self.q.get()
                #将线程从空闲列表中移除
                self.free_list.remove(current_thread)

        else:#表示不是任务
            self.gemerate_list.remove(current_thread)



    #任务执行完毕后 停止运行
    def close(self):
         time.sleep(2)
         num=len(self.gemerate_list)
         print(num)
         while num:
             self.q.put(stopEvent)#往队列添加停止标志(创建了多少线程,就添加多少)
             num-=1

    def terminals(self):
        self.terminal=True#标记任务终止
        while self.gemerate_list:
            self.q.put(stopEvent)
        self.q.empty()#清空队列



#回调函数
def callback(statue,result):
    # print(statue)
    # print(result)
    pass

#任务函数
def action(args):
    time.sleep(1)
    print(args)
    return args

#创建线程池对象
pool=ThreadPool(10)
for item in range(100):
    '''
    #将任务放在队列中
    #着手开始处理任务(线程处理)
        --创建线程
              有空闲线程,则不再创建线程
              没有空闲线程,开始创建线程
                    1.不能高于线程池的限制
                    2.根据任务来判断
        --去队列取任务
    '''
    pool.run(func=action,args=(item,),callback=callback)
# pool.close()#任务执行完后
#pool.terminals()终止任务

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!