python_way day11 自定义线程池

python_way day11  

线程池

 

 


 

为什么需要线程池

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

 

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

 

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

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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 @   wawahan  阅读(197)  评论(0编辑  收藏  举报
编辑推荐:
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
阅读排行:
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1
· 一文搞懂MCP协议与Function Call的区别
点击右上角即可分享
微信分享提示