python 学习笔记简单线程池实现
来源:互联网 发布:java 程序员周末班 编辑:程序博客网 时间:2024/05/17 02:47
#!/usr/bin/env python# -*- coding:utf-8 -*-import Queueimport threadingimport contextlibimport timeStopEvent = 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()
0 0
- python 学习笔记简单线程池实现
- Python线程池简单实现
- 线程池学习简单笔记
- Python学习笔记(五) -- Python线程池
- Python学习笔记--简单实现DNS查询
- 简单线程池的实现--JAVA/Python
- 【学习记录】简单线程池的实现
- 线程学习的简单笔记
- Python学习笔记之多线程
- python学习笔记之多线程
- 【python学习笔记】线程Threading
- Python学习笔记--线程锁
- python学习笔记(未完):线程
- Python学习笔记-Django实现简单增删改查
- 使用Python实现简单爬虫(慕课网学习笔记)
- 简单线程池实现
- 线程池简单实现
- Python学习笔记:简单作业
- CS压缩感知学习
- Train Problem I (非栈但是并没有AC)
- wifi无线网络的认证和加密方式
- java提高篇(十七)-----异常(二)
- 项目管理利器-Maven
- python 学习笔记简单线程池实现
- Java环境变量配置及验证win10
- 单进程+单线程+异步IOLoop python 服务器 demo
- stm32编程之路四——SysTick
- unity AssetBundleManifest
- java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
- 【IAP支付之一】In-App Purchase Walk Through 整个支付流程
- Manacher 回文自动机 学习笔记
- Linux下创建动态库