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

学完线程,摸索着写了个线程池,有待完善

阅读更多
首先是工作线程类

import threading

class TaskThread(threading.Thread):
    def __init__(self):
        super(TaskThread,self).__init__()
        self.e = threading.Event()
        self.setDaemon(True)

    def run(self):
        while True:
            try:
                self.task.doAction()
            except Exception,e:
                print e
            finally:
                self.e.clear()
                self.e.wait()
                
    def addTask(self,task):
        self.task = task



然后是线程池类
import threading

from Queue import Queue
from TaskThread import TaskThread

class ThreadPool(object):
    __instance = None
    __lock = threading.Lock()

    def __init__():
        pass

    def __call__(self):
        self.run()

    @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_max_size = 10,task_queue_size = 100):
        self.pool = []
        self.tasks = Queue(task_queue_size)

        for i in range(pool_max_size):    
            self.pool.append(TaskThread())

    def run(self):
        while True:
            th = None
            
            for t in self.pool:
                if not t.e.isSet():
                    th = t
                    break

            if th is not None:
                try:
                    task = self.tasks.get(0)
                except:
                    pass
                else:
                    th.addTask(task)
                    th.e.set()

                    if not th.isAlive():
                        th.start()
                    
    def addTask(self,task,timeout = 0):
        try:
            self.tasks.put(task,timeout)
            return True
        except:
            return False


粗略的测试了下,没有发现什么问题,只是目前有几个问题比较纠结:
1、要不要把ThreadPool类写成单例,因为照现在写法,继承threading.Thread之后不能start,只能依靠另外起一条线程来执行run方法
2、工作线程类执行绑定方法的时候是直接调用约定方法还是用__call__
3、总觉得目前的设计怪怪的,想继续拆分几个类出来,但又有过度设计之嫌

明天开始研究gui了,初步选定wxPython,哈哈,理我完成"神器"的目标又进一步了...
分享到:
评论

相关推荐

    多线程写法(精易模块线程池和鱼刺模块线程池)

    线程池是一种管理线程的机制,它预先创建一定数量的线程,当有任务需要执行时,线程池会分配一个空闲的线程去执行任务,而不是每次都创建新的线程。这种设计可以避免频繁创建和销毁线程带来的开销,提高系统的响应...

    C#线程池 所有线程运行完毕

    在C#编程中,线程池(ThreadPool)是一种高效的线程管理机制,它允许开发者创建并管理多个线程,而无需直接操作线程对象。线程池中的线程可以复用,减少了创建和销毁线程的开销。当我们需要执行大量短生命周期的任务...

    线程池管理多线程上传

    线程池管理和多线程上传是并发编程中的一个重要实践,特别是在大数据传输和网络服务中。在Java等编程语言中,线程池通过有效地管理和复用线程资源,避免了频繁创建和销毁线程带来的开销,提升了系统性能。下面将详细...

    qt5多线程pingIP地址(线程池)

    在本项目中,“qt5多线程pingIP地址(线程池)”是一个利用Qt5框架和多线程技术来实现对多个IP地址进行并发ping操作的应用。这个应用可能会被网络管理员或者开发人员用来快速检测网络连通性,特别是在大规模网络环境...

    C#判断线程池中所有的线程是否已经完成

    此外,线程池的复杂性意味着在某些情况下,即使所有工作者线程都可用,也可能存在未完成的任务。因此,这种方法提供了一个基本的检查,但可能不是100%准确,具体使用时需根据实际需求进行调整。

    c++ 多线程线程池 demo

    线程池是多线程编程中一个重要的概念,它能够优化系统资源的使用,提高系统的响应速度和效率。本篇文章将深入探讨C++中的线程池实现,并通过名为“OEasyPool-1.0”的示例来展示其工作原理。 线程池是预先创建并维护...

    java线程池使用后到底要关闭吗

    然而,在使用java线程池时,一个常见的问题是:使用完线程池后到底要不要关闭?本文将通过实例代码和详细解释,告诉大家使用完线程池后一定要关闭,否则可能会导致内存泄露和应用崩溃。 首先,让我们了解一下java...

    多线程的使用-一个线程池的Demo

    在IT领域,多线程是并发编程中的一个重要概念,它允许多个任务同时执行,以提高应用程序的效率和响应速度。线程池是一种线程管理机制,它预先创建了一组线程,当需要执行任务时,可以从池中获取空闲线程,而不是每次...

    多线程经典简洁例子(线程池)

    总结,多线程和线程池在软件开发中起着关键作用,尤其是在高并发场景下。理解并合理使用线程池可以提高程序的性能和响应性,同时减少系统资源的消耗。在实际项目中,开发者应根据应用需求选择合适的线程池配置,以...

    java多线程、并发及线程池介绍收藏的几篇文档

    - 线程池可以预先创建一定数量的线程,处理多个任务,避免了频繁创建和销毁线程的性能损耗。 - `ThreadPoolExecutor`的构造函数接受核心线程数、最大线程数、线程空闲时间、线程队列等参数,可以根据系统需求进行...

    多线程编程线程池

    当调用 `QueueUserWorkItem` 时,如果线程池中有可用的工作线程,则立即将委托分配给一个线程;如果没有可用线程且当前线程数量未达到预设的最大值,则创建一个新的工作线程;如果达到最大值,则将委托加入到等待...

    线程池c++,通过线程控制实现线程集动态调整线程个数

    在这个"线程池c++"的实现中,我们将探讨如何创建和管理一个线程池,以及如何根据需求动态调整线程数量。 首先,我们需要理解线程池的基本结构。线程池通常包含以下几个核心组件: 1. **工作队列**:这是一个任务...

    易语言线程池操作例程(解决内存不断升高的问题)

    但是近期写彩票软件的时候发现,多线程长期操作会导致内容不断的升高直至报错,遂想起了线程池,完善后发现不是一般的叼 啊!!!。 先简单的说下多线程和线程池的区别:。1、多线程每次启动的时候系统都要分配一定...

    java线程、线程池、xml解析入门

    Java线程、线程池和XML解析是Java编程中至关重要的三个概念,它们在实际开发中扮演着不可或缺的角色。下面将分别对这三个主题进行深入的介绍。 首先,我们来看Java线程。线程是程序执行的最小单位,一个进程可以...

    免积分C++11写的可复用的线程池类 - 开源

    标题中的“免积分C++11写的可复用的线程池类 - 开源”意味着这是一个使用C++11标准库实现的线程池类,它具有可复用性,并且是开源的,允许开发者查看和修改源代码,以便根据项目需求进行定制。 线程池是一种多线程...

    VC写的一个线程池的管理实例

    在这个"VC写的一个线程池的管理实例"中,我们可以深入理解线程池的工作原理以及如何在VC环境中构建和管理它。 1. **线程池的基本原理**: 线程池是由一组预创建或按需创建的线程组成的,这些线程等待接收任务并...

    c++ 跨平台线程 线程池

    总结来说,这个代码包提供了C++中跨平台线程池的实现,包括线程池的创建、任务调度、线程复用等功能,通过`spthread.h`进行底层线程操作的封装,`testthreadpool.cpp`作为测试代码验证其功能。理解并运用这些知识点...

    C写的线程池管理工具

    线程池管理是多线程编程中的一个重要概念,它是一种高效、可管理的并发执行机制。在计算机程序中,线程池是由多个工作线程组成的集合,这些线程预先创建并处于待命状态,等待执行任务。通过使用线程池,开发者可以...

    C语言多线程编程之线程池

    当有新任务到来时,线程池会从池中选择一个空闲线程来执行任务,而不是每次创建新的线程。这样可以避免频繁的线程创建和销毁带来的开销,提高系统效率。 线程池的设计主要包括以下几个关键组件: 1. **线程池初始...

Global site tag (gtag.js) - Google Analytics