您的位置:首页 > 编程语言 > Python开发

python-线程池

2016-07-23 08:05 471 查看
#!/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() #关闭线程池

理解注释版线程池
带注释

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: