由于Python语言本身是没有支持线程池的api,所以我自己看一些教程和文章,自己写了一个demo,直接上码:
#!/usr/bin/evn python
# -*- coding:utf-8 -*-
import threading
import Queue
import time
import contextlib
"""
创建一个线程池对象
"""
class ThreadPool(object):
StopEnevt=object(); #开关的对象
free_thread_list=[] # 空闲线程集合
genenater_thread_list=[] #总线程集合
taskQueue=Queue.Queue();# 任务集合
max_num =10;# 最大的线程数
def __int__(self,max_num=10):
#如果线程池初始化的时候有设置max_num直接替换,如果没有设置,默认是10个线程数。
self.max_num=max_num;
#self.taskQueue=Queue.Queue();
def createThread(self):#创建线程的方法
thread=threading.Thread(target=self.runTask);
thread.start();
def runTask(self):
#获取当前线程的方法
currentThread=threading.currentThread();
#把创建好的线程添加到总的线程。
self.genenater_thread_list.append(currentThread);
event=self.taskQueue.get();
while event!=self.StopEnevt:
func,args,callback=event;
try:
callbackarge = func(*args);
if callback is not None:
if callbackarge is not None:
callback(*callbackarge);
else:
callback();
except Exception as e:
print("e.message:"+str(e.message))
finally:
#self.free_thread_list.append(currentThread)
#event=self.taskQueue.get();
#self.free_thread_list.remove(currentThread);
with threadContext(strelist=self.free_thread_list,val=currentThread):
"""
2.这些代码的是使用与yield联系在一起的
当执行的了strelist.append(val)代码之后
就执行的这个代码
"""
event = self.taskQueue.get();
else:
# 没有任务之后在总的线程集删除当前线程。
self.genenater_thread_list.remove(currentThread);
def asynTask(self,func,args=(),callback=None):
task=(func,args,callback);
self.taskQueue.put(task);
# 如果线程没有创建的时候,就要调用创建线程的方法
if len(self.free_thread_list)==0 and len(self.genenater_thread_list)<self.max_num:
self.createThread();
def close(self):
# 关闭线程池的
count=len(self.genenater_thread_list)
for i in range(count):
self.taskQueue.put(self.StopEnevt);
self.taskQueue.empty();
def testTaskfunc(i):
time.sleep(0.5)
print("testTaskfunc i:"+str(i)+"\n")
def testTaskCallBack():
print("this testTaskCallBack func\n")
"""
管理上下文的方法
"""
@contextlib.contextmanager
def threadContext(strelist,val):
# 1.上下文中执行的顺序是从上而下,
strelist.append(val)
try:
yield #在这里。
finally:
# 3.这是在执行的了yield的代码之后最后执行。
strelist.remove(val)
pool=ThreadPool();
for i in range(100):
pool.asynTask(func=testTaskfunc,args=(i,),callback=testTaskCallBack);
pool.close();
大家有什么意见可以留言一下!