關於“池”機制的思考(線程池、進程池、連接池等)


“池”機制的兩大核心

  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

數據量小的時候看不出來性能的差異,但是如果併發量比較大時,有連接池的程序能夠無論併發量多大都能夠合理的重用連接。而沒有連接池的程序會出現反覆的銷燬和創建。


如有疏漏之處還望及時反饋

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章