关于“池”机制的思考(线程池、进程池、连接池等)

版权声明:本文为博主原创文章,转载请注明出处!!!(●'◡'●) https://blog.csdn.net/Small_Mouse0/article/details/84996286

“池”机制的两大核心

  1. 重用
  2. 缓冲
  3. 统一管理“池”里的对象 (这个不能作为核心)
    。。。。。

【1】“池”机制有个定长的容器。

【2】初始化时容器中存储有定量的“池”对象(在此用“池”对象统称“池”中的线程、进程或者链接等,下文同)。
【3】程序中需要使用到对象时,可直接通过“池”获取。
【4】如果“池”容器中有“池”对象时,直接给程序使用。
【5】如果“池”容器中没有“池”对象,可以创建新对象供程序使用。
【6】创建新对象时可以设置上限。
【7】程序使用完对象,放入“池”中。
【8】如果“池”容器满了,则可以销毁多余的对象。

没有
满了
没满
到达上线
没到达上线
定长容器即池
程序取对象
程序归还对象
初始化容器
判断是否有对象
判断是否到达上限
判断容器是否满
创建对象
销毁对象
等待队列

看起来阔能有点复杂,哈哈不过看下示例促进下理解。O(∩_∩)O


实例

有个“连接池”,池的大小为100,可支持最大连接数为500(假定连接程序均使用一秒后退换/销毁)

【1】

如果有连接池

当每秒有100以内个线程需要使用连接时,程序可以直接取现成的连接,程序运行效率可想而知。

如果没有连接池

当每秒有100以内的线程需要使用连接时,程序需要创建连接100个,程序运行效率很显然会受影响。
描述 需要连接数 创建连接数 n秒需要创建总连接次数
有连接池 100/s 100(可启动时创建) 0 0
没有连接池 100/s 100/s 100*n

很显然,没有连接池需要创建的连接数十分巨大,开销也不言而喻。反之使用连接池只需要在启动时创建100个即可,当然需要占据一部分内存,但是再性能方面的提升是非常大的。


【2】

如果有连接池

当有1000个线程需要使用连接时,程序可以先直接取用100个作为缓冲,但是还有900个线程五法满足,可以创建新的连接400个,此时已经提供了500个连接,但是达到了系统创建连接的上限无法再创建新的连接,剩余500个线程五法满足,需要添加到等待队列中等待池中有新的连接时才可使用。当500个拿到连接的线程用完连接时,依次将连接归还时,池可以顺次将归还的连接提供给等待队列中的线程使用。

如果没有连接池

当有1000个线程需要使用连接时,程序需要创建连接500,没使用完一个连接销毁后,在创建一个新的连接。
描述 需要连接数 创建连接数
有连接池 1000 100(可启动时创建) 400
没有连接池 1000 1000
有连接池 2000 100(可启动时创建) 400
没有连接池 2000 2000

数据量小的时候看不出来性能的差异,但是如果并发量比较大时,有连接池的程序能够无论并发量多大都能够合理的重用连接。而没有连接池的程序会出现反复的销毁和创建。


如有疏漏之处还望及时反馈

猜你喜欢

转载自blog.csdn.net/Small_Mouse0/article/details/84996286