新的datasnap使用indy10的執行緒池。不管你知不知道,datasnap都是使用執行緒池了,這和midas不同,midas預設是沒有執行緒池的。
跟蹤indy10執行緒池類tidschedulerofthreadpool的**:
procedure tidschedulerofthreadpool.init;
begin
inherited init;
assert(fthreadpool<>nil);
if not isdesigntime then begin
if poolsize > 0 then begin
with fthreadpool.locklist do try
while count < poolsize do begin
add(newthread);
end;
finally fthreadpool.unlocklist; end;
end;
end;
end;
由此可知tdstcpservertransport.poolsize屬性,預設值是10,表示執行緒池初始化的時候在池內建立10個執行緒,這個預設值太小,應該設大點。tdstcpservertransport.maxthreads屬性,預設值是0,表示執行緒池內建立執行緒的個數不設上限。池應該設乙個可建立執行緒數量的上限值,不能允許無限制地建立執行緒。
執行緒池的poolsize屬性的值應該設大些,這樣執行緒池初始化的時候就在池內建立了許多的執行緒,以後需要使用執行緒的時候,就直接從池內取,不需要再去建立新的執行緒,這節約了大量的cpu時間,但大量的執行緒需要占用較多的記憶體空間。伺服器端的記憶體空間一般都比較大,用空間換時間的策略是值得的。伺服器端其它的物件池也應該用此策略。物件池建立的時候設定poolsize=0的方法是不可取的,應該盡量設大一點,占用點記憶體空間其實根本不算什麼。
tdsserverclass.lifecycle屬性的值對執行緒池的利用效率至關重要。當lifecycle=session,乙個客戶端連線從執行緒池中獲取乙個執行緒為其服務,當這個客戶端斷開連線的時候把這個占用的執行緒歸還執行緒池中,這個執行緒占用的時間是有些長啊;當lifecycle=server,所有的客戶連線都共用乙個從執行緒池中獲取的執行緒為它們服務,這個時候執行緒池好像真是多此一舉不是,官方資料說是如果你的伺服器硬體窮的慌就用它,估計沒幾個人會窮到如此份上吧;當lifecycle=invocation,乙個客戶端發起乙個事件動作就從執行緒池中獲取乙個執行緒為它服務,這個有點費事,什麼雞毛點兒的事就要獲取乙個執行緒為它服務,一眨眼的時間這事它完了,執行緒立馬歸還執行緒池中,如此頻繁,咱真有點兒擔心執行緒池吃的消不。所以本人滿打滿算還是從了官方的建議:使用預設的session值。
DataSnap資料庫連線池,資料集物件池的應用
傳統的應用伺服器的開發往往是在servermethods單元中拖放一堆tdataset,tdatasetprovider控制項,這是乙個最簡單粗暴的開發方向,往往會造成服務端程式檔案的臃腫 服務執行期間記憶體資源消耗過大的問題。因此這種往應用伺服器中拖放一堆tdataset,tdatasetprov...
python 執行緒池 Python的執行緒池
usr bin env python coding utf 8 concurrent 用於執行緒池和程序池程式設計而且更加容易,在python3.2中才有。import sys from concurrent.futures import threadpoolexecutor,as complete...
執行緒 執行緒池
執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...