当前位置:首页 > 开发 > 编程语言 > 多线程 > 正文

重构第一次写的线程池

发表于: 2011-10-14   作者:dieslrae   来源:转载   浏览:
摘要: 最近没有什么学习欲望,修改之前的线程池的计划一直搁置,这几天比较闲,还是做了一次重构,由之前的2个类拆分为现在的4个类. 1、首先是工作线程类:TaskThread,此类为一个工作线程,用于完成一个工作任务,提供等待(wait),继续(proceed),绑定任务(bindTask)等方法 #!/usr/bin/env python # -*- coding:utf8 -*-
最近没有什么学习欲望,修改之前的线程池的计划一直搁置,这几天比较闲,还是做了一次重构,由之前的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()




第一次重构算是完成了,目前就差一个调节负载的轮询线程,不过暂时没有想到一个好点的调节策略,只有搁置...

重构第一次写的线程池

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
  这周的作业是写一个线程池,python的线程一直被称为鸡肋,所以它也没有亲生的线程池,但是竟然
简单说明 ThreadPool:是线程池管理类,提供了线程初始化、开启、关闭、任务添加等方法,管理任缓冲
最近,由于项目里需要用到线程池来提高处理速度,记录一下spring的taskExecutor执行器来实现线程池
线程池 必须得说点什么 今天在介绍线程池之前,我得来说说上上篇随笔。关于线程的优先级,我们知道
线程池: 一、线程池: 用我的话来说,现在有很多线程任务要执行,比如很多人同时访问ITeye,这是,总
什么是线程池? 诸如web服务器、数据库服务器、文件服务器和邮件服务器等许多服务器应用都面向处理
线程池: 一、线程池: 用我的话来说,现在有很多线程任务要执行,比如很多人同时访问ITeye,这是,总
线程池: 一、线程池: 用我的话来说,现在有很多线程任务要执行,比如很多人同时访问ITeye,这是,总
  学习java很久很久了,得有个5年了,但是从来都没有真正的走进java世界,希望从这篇文章开始,把
现在服务器端的应用程序几乎都采用了“线程池”技术,这主要是为了提高系统效率。因为如果服务器对应
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号