由于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()#执行提交的任务
网友评论