zoukankan      html  css  js  c++  java
  • python-线程池

    #!/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):
            self.q = queue.Queue() #定义队列无限大
            self.max_num = max_num  #定义最大值
    
            self.terminal = False  #定义为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 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)#并执行call方法
            t.start()
    
        def call(self):
            """
            循环去获取任务函数并执行任务函数
            """
            current_thread = threading.currentThread #拿到当前线程
            self.generate_list.append(current_thread) #添加到正在使用线程队列
    
            event = self.q.get() #--这里是一个获取到的元组w=()....
            while event != StopEvent:
    
                func, arguments, callback = event # w= (func, args, callback)
                try:
                    result = func(*arguments)  #执行任务  ret = aaa() --def aaa():   return 1
                    status = True      
                except Exception as e: #如果我这个任务报错
                    status = False
                    result = e
    
                if callback is not None:  #这是一个返回值
                    try:
                        callback(status, result)
                    except Exception as e:
                        pass
    
                self.free_list.append(current_thread)  #---记得看上下文代码,执行完任务,把这个线程放到空闲队列里面
                event = self.q.get()#当前的状态应该是没任务,线程等待任务,不结束
                self.free_list.remove(current_thread)  #获取任务移除休息线程
            else:
                if event = StopEvent:
                self.generate_list.remove(current_thread) #移除当前正在运行的线程,等他运行完
    
        def close(self):
            num = len(self.generate_list)
            while num:
                self.q.put(StopEvent)#
                num -= 1
    
    
    import time
    
    def work(i):
        print(i)
    
    pool = ThreadPool(10)   #定义最大线程为10个,实例化,并初始化
    for item in range(50):  #创建了50个任务
        pool.run(func=work, args=(item,))  #执行work函数,args是传参
    
    pool.close() #关闭线程池
    
    理解注释版线程池
    带注释
  • 相关阅读:
    第一节,Django+Xadmin打造上线标准的在线教育平台—创建用户app,在models.py文件生成3张表,用户表、验证码表、轮播图表
    Tensorflow 错误:Unknown command line flag 'f'
    Python 多线程总结
    Git 强制拉取覆盖本地所有文件
    Hive常用函数 傻瓜学习笔记 附完整示例
    Linux 删除指定大小(范围)的文件
    Python 操作 HBase —— Trift Trift2 Happybase 安装使用
    梯度消失 梯度爆炸 梯度偏置 梯度饱和 梯度死亡 文献收藏
    Embedding 文献收藏
    深度学习在CTR预估中的应用 文献收藏
  • 原文地址:https://www.cnblogs.com/pangguoping/p/5697785.html
Copyright © 2011-2022 走看看