最近没有什么学习欲望,修改之前的线程池的计划一直搁置,这几天比较闲,还是做了一次重构,由之前的2个类拆分为现在的4个类.
1、首先是工作线程类:TaskThread,此类为一个工作线程,用于完成一个工作任务,提供等待(wait),继续(proceed),绑定任务(bindTask)等方法
#!/usr/bin/env python
# -*- coding:utf8 -*-
import threading
class TaskThread(threading.Thread):
def __init__(self):
super(TaskThread,self).__init__()
self._e = threading.Event()
self.setDaemon(True)
self.isReady(True)
self.isActive(True)
def run(self):
while self.isActive():
try:
self.task()
except:
pass
finally:
self.wait()
def wait(self):
self.isReady(True)
self._e.clear()
self._e.wait()
def proceed(self):
self.isReady(False)
self._e.set()
if not self.isAlive() and self.isActive():
self.start()
def isReady(self,flag = None):
if isinstance(flag,bool):
self.is_ready = flag
return self.is_ready
def isActive(self,flag = None):
if isinstance(flag,bool):
self.is_active = flag
return self.is_active
def bindTask(self,task):
self.task = task
2、线程池类(ThreadPool),此类是一个单例,用于模拟一个池,并提一个同步方法getThread用于获取池中线程,若池已经空了,返回None
#!/usr/bin/env python
# -*- coding:utf8 -*-
import threading
from TaskThread import TaskThread
class ThreadPool(object):
__instance = None
__lock = threading.Lock()
def __init__():
pass
@classmethod
def getInstance(self):
self.__lock.acquire()
if not self.__instance:
self.__instance = super(ThreadPool,self).__new__(self)
self.__lock.release()
return self.__instance
def initPool(self,pool_min_size = 5,pool_max_size = 10):
self.pool_min_size = pool_min_size
self.pool_max_size = pool_max_size
self.pool = []
for i in range(self.pool_min_size):
self.pool.append(TaskThread())
def getThread(self):
th = None
self.__lock.acquire()
for t in self.pool:
if not t._e.isSet() and t.isReady():
t.isReady(False)
th = t
break
self.__lock.release()
if th is None and len(self.pool) < self.pool_max_size:
th = TaskThread()
self.pool.append(th)
return th
3、任务队列类(TaskQueue),此类是一个单例,对Queue进行了简单的封装
#!/usr/bin/env python
# -*- coding:utf8 -*-
import threading
from Queue import Queue
class TaskQueue(object):
__instance = None
__lock = threading.Lock()
def __init__():
pass
@classmethod
def getInstance(self):
self.__lock.acquire()
if not self.__instance:
self.__instance = super(TaskQueue,self).__new__(self)
self.__lock.release()
return self.__instance
def initQueue(self,task_queue_size = 100):
self.tasks = Queue(task_queue_size)
def getTask(self):
try:
return self.tasks.get(0)
except:
raise Exception,'This queue is empty.'
def addTask(self,task):
try:
self.tasks.put(task,0)
except:
raise Exception,'This queue is full.'
4、线程池管理类(ThreadPoolManager),此类负责从任务队列中获取任务,然后绑定到线程池中获取空闲线程中执行.
#!/usr/bin/env python
# -*- coding:utf8 -*-
import threading
class ThreadPoolManager(threading.Thread):
def __init__(self,pool,tasks):
super(ThreadPoolManager,self).__init__()
self.setDaemon(True)
self.pool = pool
self.tasks = tasks
def run(self):
while True:
t = self.pool.getThread()
if t is not None:
try:
task = self.tasks.getTask()
except:
t.isReady(True)
else:
t.bindTask(task)
t.proceed()
第一次重构算是完成了,目前就差一个调节负载的轮询线程,不过暂时没有想到一个好点的调节策略,只有搁置...
分享到:
相关推荐
重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt
重构建议文档第一版:给出对.net代码的重构建议以及代码范例。
重构重构重构重构重构重构重构重构重构重构
r重构r重构r重构r重构r重构r重构r重构r重构r重构
项目重构方案模板、项目重构方案模板ppt,项目重构方案计划模板
一次重构引发的分布式服务管理 一次重构引发的分布式服务管理
内容:博客代码 一次代码重构之旅-快速读写xml文件工具类封装 http://blog.csdn.net/lk_blog/article/details/8220803
第1章:重构的第一个案例 第2章:重构原则 第3章:代码的坏味道 第4章:构筑测试体系 第5章:重构名录 。。。
重构_改善既有代码的设计[高清版],喜欢的同学,欢迎下载,祝学习愉快。第一次听到“重构”这个词,它的思想足以令我感到震撼。
重构——改善既有代码设计,经典文档,架构师必须教程
对经验模态分解后的各分量IMF进行重构代码,函数可直接调用。
1. 重构的目的:为什么重构(why) 2. 重构的对象:重构什么(what) 3. 重构的时机:什么时候重构(when) 4. 重构的方法:如何重构(how)
《重构 改善既有代码的设计》清晰揭示了重构的过程,解释了重构的原理和实践方式,并给出了何时以及何地...《重构 改善既有代码的设计》提出的重构准则将帮助你一次一小步地修改你的代码,从而减少了开发过程中的风险。
本代码是《重构 改善既有代码的设计》书中的第一个案例,用于影片出租点用的程序,对于原始代码的几次重构
现在,在众所期盼之中,Joshua Kerievsky的《重构与模式》第一次深入和全面地论述了设计模式的运用与演进式的重构过程,并揭示了两者之间至关重要的联系,又一次革命性地改变了我们的设计方式。 本书阐述了模式...
现在,在众所期盼之中,joshua kerievsky的《重构与模式》第一次深入和全面地论述了设计模式的运用与演进式的重构过程,并揭示了两者之间至关重要的联系,又一次革命性地改变了我们的设计方式。 本书阐述了模式...
资源名:用于信号的EMD、EEMD、VMD分解_vmd重构_故障诊断emd_故障诊断_故障重构_VMD信号重构 资源类型:matlab项目全套源码 源码介绍:用于信号的分解、降噪和重构,实现故障诊断 源码说明: 全部项目源码都是经过...
经典软件重构 经典软件重构 经典软件重构 经典软件重构 经典软件重构