python

python自写线程池

2021-07-08  本文已影响0人  菠萝头咯

由于python自带的线程池方法不好用,主要呈现缺点2点
1.线程池无法通过手段进行停止
2.没有线程守护,导致程序已经关闭了,线程池还在运行。
故以上原因自写了一个类似线程池的类

定义线程池类

def action(max):
    my_sum = 0
    time.sleep(1)
    print(threading.current_thread().name +"   "+ str(max))
    return 1

class MyThreadPool():
    def __init__(self, workNum):
        self.tasks = []
        self.workNum = workNum
        self.exitFlag = 0

    def execute(self):
        for i in range(0,len(self.tasks),self.workNum):
            if(self.workNum>len(self.tasks)):#如果任务数小于你设定的线程数,那就直接定义线程数为任务数
                worknum = len(self.tasks)
            else:
                worknum = self.workNum
            ts = []
            for k in range(worknum):
                if(self.exitFlag):
                    print("线程池退出子线程")
                    break
                if(i+k<len(self.tasks)):
                    t = threading.Thread(target=self.tasks[i+k]["func"],args=self.tasks[i+k]["args"],daemon=True)
                    t.start()
                    ts.append(t)
            for t in ts:
                t.join()
            if(self.exitFlag):
                print("线程池退出")
                break
        self.tasks = []#任务执行完清空任务
    def shutDown(self):#可在程序运行中 调用此方法中断线程池
        self.exitFlag = 1

    def submit(self,func,args=()):
        func = {"func":func,"args":args}
        self.tasks.append(func)


if __name__=='__main__':
    pool = myThreadPool(3)#定义3个线程的线程池
    for i in range(15):#提交15个任务
        pool.submit(action,args=(i,))
    pool.execute()#执行提交的任务

上一篇下一篇

猜你喜欢

热点阅读