一个python线程池的源码解析

python为了方便人们编程高度封装了很多东西,比如进程里的进程池,大大方便了人们编程的效率,但是默认却没有线程池,本人前段时间整理出一个线程池,并进行了简单的解析和注释,本人水平有限,如有错误希望高手指点,愿与君共同学习与进步,废话少说,上源码

import threading,time,queue
stop = object()
class Thread(object):
    def __init__(self,max_num):#构造函数
        self.q = queue.Queue()  #创建一个队列,存放任务
        self.max_num = max_num  #线程池最大线程数
        self.terminal = False
        self.generate_list = [] #真实创建的线程列表
        self.free_list = [] #空闲线程列表

    def generate_thread(self):  #创建进程并执行的函数
        t = threading.Thread(target = self.call)
        t.start()
    def call(self):     #获取任务并且执行任务函数
        current_thread = threading.currentThread    #获取当前线程
        self.generate_list.append(current_thread)   #加入列表
        even = self.q.get() #从队列获取到任务
        while even != stop:#在有 任务 的情况下循环执行任务
            func,args,callback = even
            try:
                ret = func(args)  #执行函数
                status = True
            except Exception as e:  #如果有错误status为假,执行结果fu赋值ret
                status = False
                ret = e
            if callback is not None:#判断如果没有回调函数
                try:
                    callback(status,ret)
                except Exception as e:
                    pass
            if self.terminal:   #p判断是否终止
                even = stop
            else:
                self.free_list.append(current_thread)   #执行完毕将线程加入空闲
                even = self.q.get()     #再次获取
                self.free_list.remove(current_thread)#修改状态为非闲置
        else:
            self.generate_list.remove(current_thread)#如果没有任务,会删除真实创建的线程列表中的元素

    def run(self, func, args, callback=None):  # 线程池运行的方法
        w = (func, args, callback,)
        self.q.put(w)  # 将任务放进队列
        if len(self.free_list) == 0 and len(self.generate_list) < self.max_num:#判断是否创建线程
            self.generate_thread()
    def close(self):    #关闭线程函数
        num = len(self.generate_list)
        while num:
            self.q.put(stop)
            num -= 1
    def terminal(self):     #一个可以在任务没执行完的情况下强制终止的函数,
        self.terminal = True# 根据 self.terminal判断
        max_num = len(self.generate_list)
        while max_num:  #放入列表长度的个数的stop结束正在阻塞的进程
            self.q.put(stop)
            max_num -= 1#该方法清空了线程但是没清空队列任务

    def terminall(self):  # 一个可以在任务没执行完的情况下强制终止的函数,
        self.terminal = True  # 根据 self.terminal判断

        while self.generate_list:#如果列表不为空就会不断放入sotp清空线程列表
            self.q.put(stop)
        self.q.empty()#线程清空完毕之后清空队列,完美。
def work(a):    #以下为示例
    print(a)
pool = Thread(10)
for i in range(50):
    pool.run(func=work,args=i)
pool.close()

 

posted @ 2016-08-09 15:14  菠萝丁  阅读(795)  评论(0编辑  收藏  举报