執行緒池一直是乙個比較神秘的概念,在很多程式設計師心中。說到執行緒池,不能不說說執行緒的概念,也不能不說說池的概念。
執行緒就是乙個執行線索,或者說乙個執行序列,排程器分配給它cpu,它就可以撒歡了。說起來也是蠻容易理解的乙個東西。不過首先需要注意的是它表示的是乙個動態的概念,是乙個執行的指令序列。
池其實是乙個比喻,表示一種容器,這種容器的特點是:容納預定義個數的物件,只不過它們(這些物件)都處於非啟用狀態,一旦需要這種物件,就啟用這些物件,把它們從池子中拿出來用,當不需要的時候再次放入池子中,進入鈍化的狀態。池的目的是希望通過減少建立和銷毀物件的次數而提高效能,當然,這是乙個典型的用空間換時間的策略。
執行緒池不用多說了,就是容納執行緒的池子。
可是,怎麼實現乙個執行緒池呢?
我們這樣設想一下,這個池子裡面放滿了執行緒,都處於鈍化的狀態,如果有任務需要執行,就從池中取出來執行緒,執行這個任務,執行完了後再次放入池中就行了。
且慢!這樣說起來簡單,怎麼實現呢?
還得從執行緒慢慢掰起。
執行緒是乙個排程線索,這前面已經說過。可是具體來說是怎麼回事呢?是這樣的:你必須實現乙個完成任務的指令序列,然後向排程器登記一下,說這個序列你看著辦吧,有空讓它執行起來。好了,這下,排程器在願意的時候,就會啟動這個指令序列了。當然,排程器甚至可以在執行中途暫時停止執行,以後再次啟動它(當然是從暫時停止的那一點開始)。當這些指令執行完了以後,排程器就會釋放相關的一些資訊,對於程式設計師使用者來說,這個執行緒就算是over了。排程器建立乙個物件記錄這個指令序列(執行緒)的各種上下文資訊,並且分配給它相關的資源(主要是棧和暫存器)什麼的,這就叫程序建立。
說到這裡,大家就明白了,所謂的執行緒對於程式設計師來說就是乙個運算序列(最明顯的就是乙個c語言函式),都是由排程器管理執行的。
那麼,現在我們開始設想,究竟怎麼實現執行緒的重複使用,怎麼實現執行緒池?
這樣吧,我先寫乙個基本的執行緒,然後再以此為基礎討論執行緒池。
void threadfunc(void)
int td = registerthread(threadfunc); //這兒一般叫做什麼create thread 之類的,我寧願把它叫做註冊。這兒不是我們的關鍵,不同的平台採用的方式也略有不同。返回的一般是執行緒的控制代碼或者描述符,我們可以通過它對執行緒進行一定的精細操縱。
好了,我們的執行緒就弄好了。乙個threadfunc運算序列。向排程器登記一下,ok了。
通過上面的分析我們知道,執行緒的建立,銷毀,換入(執行),換出(暫停)都是由排程器完成的,而排程器是os的一部分(我說的是一般情況,特殊情況另論),不是我們可以控制的,所以我們沒有辦法讓排程器知道我這個執行緒是希望作為乙個可以池化的執行緒存在的,當完了以後不要釋放,還需要以後幹別的活呢。
不過,就算排程器能配合我們,我們也得有個辦法給它分配乙個別的活,不是麼?好,先假設排程器支援,我們的程式就會變成:
void threadfunc(void)
void anothertask(void)
int td = registerthread(threadfunc, ispooled);
giveanothertask(td, anothertask);
...可惜的是,我們的排程器不支援這樣的介面,也就是說,我們沒有辦法這樣實現我們的可以池化的執行緒。我們得另想辦法。
我們沒有辦法再排程器上做手腳,只好把目光放在看似沒有什麼可以折騰得執行緒函式本身上了。
void threadfunc(void)
它能變出什麼新花樣呢?我左看右看上看下看……,還是沒看見?呵呵,函式指標!
void threadfunc(void)
}我們看看,這樣是不是就可以通過給fp賦予不同的值來執行不同的任務了?對,執行緒池的基本實現方式就是如此。如果它跟command的模式結合起來實現會覺得非常舒服。
python 執行緒池 Python的執行緒池
usr bin env python coding utf 8 concurrent 用於執行緒池和程序池程式設計而且更加容易,在python3.2中才有。import sys from concurrent.futures import threadpoolexecutor,as complete...
執行緒 執行緒池
執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...
執行緒 執行緒池
乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...