1. 程式人生 > >關於“池”機制的思考(執行緒池、程序池、連線池等)

關於“池”機制的思考(執行緒池、程序池、連線池等)


“池”機制的兩大核心

  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

資料量小的時候看不出來效能的差異,但是如果併發量比較大時,有連線池的程式能夠無論併發量多大都能夠合理的重用連線。而沒有連線池的程式會出現反覆的銷燬和建立。


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