zoukankan      html  css  js  c++  java
  • 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.如果任务小于线程数量,就会有浪费,如果可以实现需要使用一个就创建一个,如果不用了就减少线程池

  • 相关阅读:
    Qt之根据扩展名获取文件图标、类型
    C++根据扩展名获取文件图标、类型
    Qt之QFileIconProvider(根据扩展名获取文件图标、类型)
    Qt之QTemporaryFile
    Qt之QFileIconProvider
    Qt之字典划词
    Qt之滚动字幕
    Qt之QThread
    Python 安装 httplib2
    Qt之QTimer
  • 原文地址:https://www.cnblogs.com/python-way/p/5690225.html
Copyright © 2011-2022 走看看