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

  • 相关阅读:
    deepin-wine-tim 字体发虚
    windows&linux双系统时间相差8小时
    Linux 禁用 ipv6
    双系统win10更新后无法进入linux
    Failed to receive SOCKS4 connect request ack 解决
    zsh 使用通配符功能
    vux修改css样式的2种办法
    Ubuntu 16.04 安装OpenSSH7.4
    Nginx开启http2访问和gzip网页压缩功能
    vue开发环境和生产环境里面解决跨域的几种方法
  • 原文地址:https://www.cnblogs.com/python-way/p/5690225.html
Copyright © 2011-2022 走看看