python_way day11 自定义线程池

python_way day11  

线程池

 

 


 

为什么需要线程池

线程多一些固然好,但是过多的线程反倒影响系统的负荷,所以我们就需要创建合适多的线程,哪我们把线程放到哪里?这时就放到线程池中。

 

线程池中存放着固定数量的线程池,谁需要使用线程,就从这个容器中取。取空了就要等待,什么时候有什么时候拿去用

 

但是python中没有给线程池提供比较好的方法,所以我们要自己写,或者使用第三方模块

 

 

import threading
import queue
import time
class Mythreadpoll:                #自定义一个线程池类
    def __init__(self,maxsize=5):
        """
        初始化类,并生成队列,将线程放到队列中,这个队列就可以作为线程池
        :param maxsize:  传入一个数值,这个数作为线程池最大线程数
        """
        self.maxsize = maxsize
        self._q = queue.Queue(maxsize)
        for i in range(maxsize):
            self._q.put(threading.Thread)  #把线程类存入到这个队列中

    def get_thread(self):
        """
        获取线程池中的线程
        :return:
        """
        return self._q.get(timeout=1)

    def add_thread(self):
        """
        因为取走一个线程就少一个线程,所以需要向线程池中添加线程
        :return:
        """
        self._q.put(threading.Thread)

def f1(arg,p):      #接受poll 然后执行添加add_thread方法
    time.sleep(1)
    p.add_thread() #线程就是执行这个任务,每一个任务执行完就往线程池中添加一个
    print(arg)


poll = Mythreadpoll()
for i in range(30):
    t = poll.get_thread()           #获取的线程的类,每从队列中获取一个线程类队列中就少一个线程类,这样执行5次后队列中就空了,到这里就会阻塞住
    obj = t(target=f1,args=(i,poll))    #传入参数实例化这个线程类,将poll传进去
    obj.start()                     #实行线程类的start方法

 

上面的线程有一些问题

1.原线程没有被重用,需要反复的创建线程

2.如果任务小于线程数量,就会有浪费,如果可以实现需要使用一个就创建一个,如果不用了就减少线程池

 

posted @ 2016-07-21 01:06  wawahan  阅读(195)  评论(0编辑  收藏  举报