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() #关闭线程池

理解注释版线程池
带注释

 

posted @ 2016-07-23 08:05  unixfbi.com  阅读(213)  评论(0编辑  收藏  举报