python 学习笔记简单线程池实现
2016-12-19 23:12
453 查看
#!/usr/bin/env python # -*- coding:utf-8 -*- import Queue import threading import contextlib import time StopEvent = object() class ThreadPool(object): def __init__(self, max_num, max_task_num=None): if max_task_num: self.q = Queue.Queue(max_task_num) else: self.q = Queue.Queue() self.max_num = max_num # 最大num self.cancel = False self.terminal = False self.generate_list = [] self.free_list = [] def run(self, func, args, callback=None): """ 线程池执行一个任务 :param func: 任务函数 :param args: 任务函数所需参数 :param callback: 任务执行失败或成功后执行的回调函数, 回调函数有两个参数1、任务函数执行状态;2、任务函数返回值(默认为None,即:不执行回调函数) :return: 如果线程池已经终止,则返回True否则None """ if self.cancel: return if len(self.free_list) == 0 and len(self.generate_list) < self.max_num: self.generate_thread() w = (func, args, callback,) self.q.put(w) def generate_thread(self): """ 创建一个线程 """ t = threading.Thread(target=self.call) t.start() def call(self): """ 循环去获取任务函数并执行任务函数 """ current_thread = threading.currentThread() self.generate_list.append(current_thread) event = self.q.get() while event != StopEvent: func, arguments, callback = event try: result = func(*arguments) success = True except Exception as e: success = False result = None if callback is not None: try: callback(success, result) except Exception as e: pass with self.worker_state(self.free_list, current_thread): if self.terminal: event = StopEvent else: event = self.q.get() else: self.generate_list.remove(current_thread) def close(self): """ 所有任务完成后,关闭所有进程 """ self.cancel = True full_size = len(self.generate_list) while full_size: self.q.put(StopEvent) full_size -= 1 def terminate(self): """ 无论是否还有任务,终止线程 """ self.terminal = True while self.generate_list: self.q.put(StopEvent) @contextlib.contextmanager def worker_state(self, state_list, worker_thread): """ 用于记录线程中正在等待的线程数 """ state_list.append(worker_thread) try: yield finally: state_list.remove(worker_thread) if __name__ == '__main__': pool = ThreadPool(10) def callback(status, result): print status print result pass def action(i): print(i * 100) for i in range(30): ret = pool.run(action, (i,), callback) time.sleep(5) print(len(pool.generate_list), len(pool.free_list)) time.sleep(3) pool.close() pool.terminate()
相关文章推荐
- 线程池原理及python实现学习笔记-持续更新
- python学习笔记:"爬虫+有道词典"实现一个简单的英译汉程序
- Python OpenCV学习笔记之:图像直方图反向投影(backprojection)原理简单实现
- Python学习笔记-Django实现简单增删改查
- 【python学习笔记】flask实现简单的接收json返回json的接口
- oracle 最简单的学习笔记,增删改查,PLSQL基本语法,游标,函数,存储过程的实现
- linux0.11学习笔记-技术铺垫-简单AB任务切换程序(5)-实现三个任务切换
- D3D学习笔记之六---简单的动画实现。
- (二)数据结构学习笔记 简单堆栈,STL中堆栈的实现
- IOS学习笔记之实现一个简单的表
- python学习(1)--实现简单的服务器与客户端
- linux0.11学习笔记-技术铺垫-简单AB任务切换程序(1)-实现一个简单的bootloader
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(1) f(x) = 2f(x-1) + x^2
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(2) IntCell类
- linux0.11学习笔记-技术铺垫-简单AB任务切换程序(1)-实现一个简单的bootloader
- 【学习笔记】DM9000裸机驱动(三)之简单ARP协议的实现
- Silverlight学习笔记(七)-----Silverlight事件处理之鼠标事件实现简单拖拽
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(6)高效率的幂运算
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(5)欧几里得算法欧几里得算法求最大公约数
- [WPF] Felix 的线程学习笔记(二)——从WPF入手,实现简单的多线程