程序池和執行緒池相似,所以這裡我們以程序池為例介紹,下面對程序池的討論完全適用於執行緒池(如果沒有特殊宣告)。
程序池是由伺服器預先建立的一組子程序,這些子程序的數目在3~10個之間(典型情況)。執行緒池的數量應該和cpu數量差不多。
程序池中的所有子程序都執行者相同的**,並具有相同的屬性。因為程序池在伺服器啟動之初就建立好了,所以每個子程序都相對「乾淨」,即它們沒有開啟不必要的檔案描述符(從父程序繼承而來),也不會錯誤的使用大塊的堆記憶體(從父程序複製得到)。
當有新的任務到來時,主程序將通過某種方式選擇程序池中的某乙個子程序來為之服務。相比於動態建立子程序,選擇乙個已經存在的子程序的代價顯然要小得多。至於主程序選擇哪個子程序來為新任務服務,有兩種方式:
主程序使用某種演算法來中東選擇子程序。最簡單常用的演算法是隨機演算法和roundrobin(輪流選取演算法),但是更智慧型的演算法將使任務在各個工作程序中更均勻的分配,從而減輕伺服器的整體壓力。
主程序和所有子程序通過乙個共享的工作佇列來同步,子程序都睡眠在該工作佇列上。當有新的任務到來時,主程序將任務新增到工作佇列中。這將喚醒正在等待任務的子程序,不過只有乙個子程序將獲得新任務的「接管權」,它可以從工作佇列中取出任務並執行,而其他子程序將繼續睡眠在工作佇列上。
當選擇好子程序後,主程序還需要使用某種通知機制來告訴目標子程序有新任務需要處理,並傳遞必要的資料。最簡單的方法是在父程序和子程序之間預先建立好一條管道,然後通過該管道來實現所有程序間的通訊。在父執行緒和子執行緒之間傳遞資料就要簡單的多,因為我們可以吧這些資料定義為全域性的,那麼它們本身就是被所有執行緒共享的。
主線程需要將檔案描述符傳遞給函式執行緒
函式執行緒啟動起來後必須阻塞在獲取檔案描述符之前
訊號量控制主線程向函式執行緒通知獲取檔案描述符事件
主線程在陣列中插入資料,以及函式執行緒獲取陣列中的資料都必須是互斥的
#include#include#include#include#include#include#include#include#include#include#includesem_t sem;
pthread_mutex_t mutex;
void *pthread_fun(void *arg);
int clilink[10];
int initclilink()
}int insert(int c)
} pthread_mutex_unlock(&mutex);
if(i>=10)
return -1;
return 0;
}int getcli()
clilink[i]=-1;
pthread_mutex_unlock(&mutex);
return c;
}int main()
initclilink();
sem_init(&sem,0,0);
pthread_mutex_init(&mutex,null);
while(1)
if(insert(c)==-1)
sem_post(&sem);//對訊號量的v操作 }}
void *pthread_fun(void *arg)
; int n=recv(c,buff,127,0);
if(n<=0)
printf("%d: %s\n",c,buff);
send(c,"ok",2,0);
} }}
在程式啟動時,建立多個程序,將子程序維護在程序池
程序池中的程序必須阻塞在獲取到檔案描述符之前
主程序負責接收客戶連線,並將獲取到的客戶連線檔案描述符傳遞給程序池中的程序
必須借助於程序間通訊,不能僅僅傳遞c值,傳遞的是檔案描述符
執行緒池 程序池
執行緒池 程序池 池子解決什麼問題?1.建立 銷毀執行緒伴隨著系統開銷,如果過於頻繁會影響系統執行效率 2.執行緒併發數量過多,搶占系統資源,從而導致系統阻塞甚至宕機 3.能夠剛好的控制和管理池子裡面的執行緒和程序 concurrent.futures模組提供了高度封裝的非同步呼叫介面 thread...
程序池, 執行緒池
知識儲備 池 裝載固定數量介質,該介質值得是程序或者執行緒 為什麼要用?讓機器在自己可承受的範圍內去保證乙個高效的工作 from concurrent.futures import processpoolexecutor,threadpoolexecutor pool processpoolexec...
程序池 執行緒池
在保證計算機硬體安全的情況下最大限度的利用計算機 池其實是降低了程式的執行效率,但是保證了計算機硬體的安全 硬體的發展跟不上軟體的速度 from concurrent.futures import processpoolexecutor p processpoolexecutor 5 def tas...