`
dieslrae
  • 浏览: 35385 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

重构第一次写的线程池

阅读更多
最近没有什么学习欲望,修改之前的线程池的计划一直搁置,这几天比较闲,还是做了一次重构,由之前的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
1
分享到:
评论

相关推荐

    Java代码构建一个线程池

    下面我们将根据给定的部分内容,重构并详细解释一个简单的线程池实现: ```java // TestThreadPool.java public class TestThreadPool { public static void main(String[] args) { try { BufferedReader br = ...

    重构建议文档(第一版)

    重构建议文档第一版:给出对.net代码的重构建议以及代码范例。

    重构_重构_改善既有代码_

    《重构:改善既有代码设计》是一本由Martin Fowler所著的经典IT著作,它详细阐述了在软件开发过程中如何通过重构来提升代码质量、可读性和维护性。重构是一种系统性的方法,旨在不改变软件外在行为的前提下,改进其...

    【EMD重构】.rar_EMD重构函数_IMF变量重构_tomorrowi4n_模态分解_重构

    在描述中提到的"对经验模态分解后的各分量IMF进行重构代码,函数可直接调用",意味着这个压缩包中包含了一个名为"EMDchonggou.m"的MATLAB脚本文件,该文件提供了实现IMF重构功能的代码。用户可以直接运行这个函数,...

    项目重构方案模板、ppt

    项目重构方案模板、项目重构方案模板ppt,项目重构方案计划模板

    重构(Refactoring)英文版

    2. **逐步进行**:重构应当是一系列小步骤组成的连续过程,而不是一次性大改动。每次只修改一小部分代码,并且在每一步后都进行测试,确保代码仍然按预期工作。 3. **保持简洁**:重构的目标之一就是简化代码结构。...

    一次代码重构之旅-快速读写xml文件工具类封装

    在描述中提到的博客文章“一次代码重构之旅-快速读写xml文件工具类封装”,作者分享了如何通过Java进行XML操作的优化,将原始的XML处理代码整合到一个工具类中,提供简洁易用的API。在阅读该博客文章的过程中,我们...

    27丨理论一:什么情况下要重构?到底重构什么?又该如何重构?1

    重构是软件开发过程中的一个重要环节,它涉及到代码的优化、设计改进和质量提升,而不改变程序的外部行为。本文将详细探讨重构的目的、对象、时机和方法,帮助开发者理解和掌握重构的核心理念。 **重构的目的(Why...

    重构改善既有代码的设计第2版.pdf

    6. 第一组重构:包括提炼函数、内联函数、提炼变量、内联变量、改变函数声明、封装变量、变量改名、引入参数对象、函数组合成类、函数组合成变换、拆分阶段等。 7. 封装:包括封装记录、封装集合、以对象取代基本...

    Java重构示例一.docx

    Java重构是一种重要的软件开发实践,旨在提升代码质量、可读性以及可维护性,而不会改变软件的功能。在本文中,我们将深入探讨四个常见的重构原则和技术,这些技术可以帮助开发人员优化他们的Java代码。 首先,我们...

    软件重构讲义,自己整理的一个软件重构ppt

    《软件重构讲义》是关于软件开发中重构技术的一份资料,主要涵盖了重构的基本概念、目的、时机选择、流程以及代码质量改进等方面。重构是一种在不改变软件功能的前提下,通过改进代码结构以提升软件设计质量、可维护...

    第三章 多视图射影重构

    其中表示第 i 个摄像机的投影矩阵,是一个 3×4 秩 3 的齐次矩阵。对于 F 幅图像和 P 个空间物体点,则有: 其中矩阵称为测量矩阵,式(3.7)表明可以分解为一个表示摄像机运动的矩阵和一个表示空间物体形状的矩阵...

    重构-改善既有代码的设计+中文版

    第1章:重构的第一个案例 第2章:重构原则 第3章:代码的坏味道 第4章:构筑测试体系 第5章:重构名录 。。。

    重构 改善既有代码的设计 pdf 中文

    首先,重构应该是一个持续的过程,而不是一次性的大工程。其次,应该保持频繁的测试,确保代码重构不会引入新的错误。重构还应该采取小步快跑的方式,每次只进行少量改动,并且频繁地进行代码审查和测试,从而确保...

    [电子书] 重构与模式

    《重构与模式》是软件开发领域的一本经典著作,作者为Addison-Wesley Professional出版社。这本书主要探讨了如何在实际编程过程中有效地进行重构,并将其与设计模式相结合,以提升软件质量和可维护性。 重构是一种...

    Java并发和重构

    例如,可以使用线程池(ThreadPoolExecutor)来管理和控制线程数量,避免过多线程导致的资源浪费和上下文切换开销。此外,还可以使用非阻塞I/O(NIO)或者Java 7引入的异步I/O(AIO)来提高系统性能。并发集合类,如...

    emd.rar_emd信号重构_emd分解重构_emd重构_经验模态分解

    4. **残差计算**:将原始信号减去平均包络线,得到第一个IMF。这个残差通常包含了比原信号更慢变化的成分。 5. **迭代过程**:将残差作为新的信号,重复上述步骤,提取出下一个IMF。这个过程持续进行,直到残差只...

    代码重构.pdf

    《代码重构》一书由Martin Fowler编写,是软件开发领域中关于代码质量提升的经典之作。书中详细阐述了重构代码的必要性、重构的时机以及如何安全地重构代码。重构指的是在不改变软件外部行为的前提下,改进其内部...

Global site tag (gtag.js) - Google Analytics