• 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() #关闭线程池
    
    理解注释版线程池
    带注释
  • 相关阅读:
    js注意点:数组比较大小方法及数组与对象的区别
    ubuntu开通ftp虚拟用户
    linux(centos)禁止升级内核的办法
    解决ubuntu新建用户后,tab键不能使用的问题
    ubuntu下php7+mysql+nginx安装笔记
    使用nginx+lua+GraphicsMagick实现图片自动 裁剪
    mysql5.7配置文件(仅供参考)
    ubuntu下安装基于Apache的SVN服务器
    Linux CentOS 7.X 如何修改内核启动默认顺序
    Linxu下Redis安装
  • 原文地址:https://www.cnblogs.com/pangguoping/p/5697785.html
Copyright © 2020-2023  润新知