關於“池”機制的思考(執行緒池、程序池、連線池等)
阿新 • • 發佈:2018-12-14
“池”機制的兩大核心
- 重用
- 緩衝
統一管理“池”裡的物件(這個不能作為核心)
。。。。。
【1】“池”機制有個定長的容器。
【2】初始化時容器中儲存有定量的“池”物件(在此用“池”物件統稱“池”中的執行緒、程序或者連結等,下文同)。
【3】程式中需要使用到物件時,可直接通過“池”獲取。
【4】如果“池”容器中有“池”物件時,直接給程式使用。
【5】如果“池”容器中沒有“池”物件,可以建立新物件供程式使用。
【6】建立新物件時可以設定上限。
【7】程式使用完物件,放入“池”中。
【8】如果“池”容器滿了,則可以銷燬多餘的物件。
看起來闊能有點複雜,哈哈不過看下示例促進下理解。O(∩_∩)O
例項
有個“連線池”,池的大小為100,可支援最大連線數為500(假定連線程式均使用一秒後退換/銷燬)
【1】
如果有連線池
當每秒有100以內個執行緒需要使用連線時,程式可以直接取現成的連線,程式執行效率可想而知。如果沒有連線池
當每秒有100以內的執行緒需要使用連線時,程式需要建立連線100個,程式執行效率很顯然會受影響。描述 | 需要連線數 | 建立連線數 | n秒需要建立總連線次數 |
---|---|---|---|
有連線池 | 100/s | 0 | |
沒有連線池 | 100/s | 100/s | 100*n |
很顯然,沒有連線池需要建立的連線數十分巨大,開銷也不言而喻。反之使用連線池只需要在啟動時建立100個即可,當然需要佔據一部分記憶體,但是再效能方面的提升是非常大的。
【2】
如果有連線池
當有1000個執行緒需要使用連線時,程式可以先直接取用100個作為緩衝,但是還有900個執行緒五法滿足,可以建立新的連線400個,此時已經提供了500個連線,但是達到了系統建立連線的上限無法再建立新的連線,剩餘500個執行緒五法滿足,需要新增到等待佇列中等待池中有新的連線時才可使用。當500個拿到連線的執行緒用完連線時,依次將連線歸還時,池可以順次將歸還的連線提供給等待佇列中的執行緒使用。如果沒有連線池
描述 | 需要連線數 | 建立連線數 |
---|---|---|
有連線池 | 1000 | |
沒有連線池 | 1000 | 1000 |
有連線池 | 2000 | |
沒有連線池 | 2000 | 2000 |
資料量小的時候看不出來效能的差異,但是如果併發量比較大時,有連線池的程式能夠無論併發量多大都能夠合理的重用連線。而沒有連線池的程式會出現反覆的銷燬和建立。
如有疏漏之處還望及時反饋