1. 程式人生 > >自定義高階版python執行緒池

自定義高階版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