在開發過程中,某些業務場景可能要使用到程序池或者執行緒池。主要目標是消除動態建立程序或程序時的開銷。一般如果能夠準確**自己每個程序或程序的職責,這個都是在程式啟動時就建立的,後期不會動態的去建立執行緒池或程序池。今天主要從幾個方面來學習和**程序池或執行緒池技術。
常見的web伺服器(需要處理較多的併發請求):
常見的lighttpd/nginx等web伺服器,以及常見快取系統。
常見的server端(遊戲、直播等行業):
要處理大量的併發請求,要減小響應延遲。
1、介紹
程序池作為乙個服務的基礎元件需要考慮如下內容:1、可配置(程序容量)。2、動態擴容(到達負載是不是可以擴容?)。3、程序池相關操作。
常規程序池模型:
程序池中的所有子程序都執行著相同的**,並具有相同的屬性,比如優先順序、pgid等。當有新的任務到來時,主程序將通過某種方式選擇程序池中的某乙個子程序來為之服務。
負載均衡演算法:隨機演算法和rr演算法。
主程序和子程序的同步:用佇列、訊息傳遞可以採用管道的方式。
為什麼要多程序或多執行緒實現併發呢?如果單程序或單執行緒則所有的工序就只能像流水線一樣幹完這件才能幹那件,而且整個工序完成前僅只能幹一件事。
2、需求
3、類設計
實現半同步-半非同步併發服務程序池類:
資料屬性:程序集合、程序狀態(休眠、徵用)、訊息管道(與主程序通訊)、程序角色、程序序號。
操作屬性:建構函式(建立程序池)、執行主程序、執行子程序、子程序的處理方法。
設計思想:單例模式。
網路架構:epoll模式。
設計要求:能適配各種型別的操作。採用模板技術。
cgi服務類:
主程序:網路服務的監聽。分發listen事件,如果有listen事件,則通過管道傳送訊息到子程序。
子程序:統一的處理過程。子程序從管道中讀取到訊息,進行連線,建立的連線放入佇列,進行讀寫事件處理。
4、原始碼實現
原始碼實現注意事項:g++不支援模板申明和定義分離。
原始碼:
此次主要在複習epoll 等api,以及設計乙個類模板、程序池技術等。
程序池 執行緒池
程序池和執行緒池相似,所以這裡我們以程序池為例介紹,下面對程序池的討論完全適用於執行緒池 如果沒有特殊宣告 程序池是由伺服器預先建立的一組子程序,這些子程序的數目在3 10個之間 典型情況 執行緒池的數量應該和cpu數量差不多。程序池中的所有子程序都執行者相同的 並具有相同的屬性。因為程序池在伺服器...
執行緒池 程序池
執行緒池 程序池 池子解決什麼問題?1.建立 銷毀執行緒伴隨著系統開銷,如果過於頻繁會影響系統執行效率 2.執行緒併發數量過多,搶占系統資源,從而導致系統阻塞甚至宕機 3.能夠剛好的控制和管理池子裡面的執行緒和程序 concurrent.futures模組提供了高度封裝的非同步呼叫介面 thread...
程序池, 執行緒池
知識儲備 池 裝載固定數量介質,該介質值得是程序或者執行緒 為什麼要用?讓機器在自己可承受的範圍內去保證乙個高效的工作 from concurrent.futures import processpoolexecutor,threadpoolexecutor pool processpoolexec...