mport time
import queue
import threading
import contextlib
StopEvent = object()
class ThreadPool():
def __init__(self,max_num):
#普通对象q ,创建一个队列没有加限定长度,
# 这个队列就可以接受无限多的东西
self.q = queue.Queue()
self.max_num = max_num
self.terminal = False
#真实创建的线程列表
self.generate_list = []
#空闲线程列表
self.free_list = []
def run(self,func,args,callback = None):
'''
线程池执行一个任务
:param func: 任务函数
:param args: 任务函数所需的参数
:param callback:回调函数
:return:
'''
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()
else:
pass
def generate_thread(self):
'''
创建一个线程
:return:
'''
t = threading.Thread(target = self.call)
t.start()
def call(self):
#获取当前线程
current_thread = threading.currentThread
self.generate_list.append(current_thread)
#取任务并执行
event = self.q.get()
while event != StopEvent:
#元组是任务包,揭开任务包,执行任务
func, arguments, callback = event
try:
result = func(*arguments)
status =True
except Exception as e :
status = False
result = e
if callback is not None:
try:
callback(status,result)
except Exception as e:
pass
if self.terminal:
event = StopEvent
else:
self.free_list.append(current_thread)
event = self.q.get()
self.free_list.remove(current_thread)
else:
#不是元组,不是任务
self.generate_list.remove(current_thread)
def close(self):
num = len(self.generate_list)
while num:
self.q.put(StopEvent)
num -= 1
def terminals(self):
self.terminal = True
max_num = len(self,generate_list)
while max_num:
self.q.put(StopEvent)
max_num -= 1
# __init__
pool = ThreadPool(5)
def callback():
pass
def action(i):
time.sleep(0.6)
print(i)
for i in range(300):
#将任务放在队列中
#处理任务
# 1.创建线程
# 有空闲则不创建,不能高于限制
# 2.线程去队列中取任务
#
pool.run(action,(1,),callback)
pool.terminals()
转载于:https://www.cnblogs.com/juex/p/9715143.html