我正處於一個問題中,我無法決定採取哪種解決方案。線程池vs許多單線程
這個問題有點獨特。讓我們這樣說,我從網絡上不斷接收數據(每秒2到4次)。現在每個數據都屬於不同的組,比如說。 現在,我們稱這些組,group1,group2等。
每個組都有一個專門的作業隊列,來自網絡的數據將被過濾並添加到其相應的組中進行處理。
起初,我爲每個組創建了一個專用線程,它將從作業隊列獲取數據,對其進行處理,然後進入阻塞狀態(使用鏈接阻塞隊列)。
但是我的高級建議我應該使用線程池,因爲這種方式線程不會被阻塞,並且可以被其他組用於處理。
但是,事情就是這樣,數據即時獲取速度足夠快,並且線程處理它的時間足以讓線程可能不會進入阻塞模式。這也將保證數據按順序進行處理(作業1在作業2之前完成),這在池中很少有機會可能不會發生。
我的老人也傾向於這樣的事實,因爲線程是POOLED(即時通訊認爲他真的是這個詞;)),彙集也將節省我們大量的內存。雖然我不同意這一點,因爲我個人認爲,彙集或不是每個線程都有自己的堆棧內存。除非線程池中有某些我不知道的東西。
最後一件事,我一直認爲集合有助於短時間內在大量工作中出現工作。這是有道理的,因爲線程產生將是一個性能殺手,因爲初始化一個線程所花費的時間比做這項工作花費的時間多得多。所以在這裏彙集有很多幫助。
但在我的情況下,group1,group2,...,groupN總是保持活着。所以如果有數據,他們仍然會在那裏。所以線程產卵在這裏不是問題。
我的老人不服氣,希望我使用pooling解決方案,因爲它的內存佔用很大。
那麼,採取哪條路?
謝謝。
在這樣的情況下,只有一個答案。冷酷的事實!通過適當的受控模型/原型證明哪個更好。您可能會感到驚訝,因爲在不同的情況下,每個人都可能有效。 – 2012-07-28 11:59:18
需要CYA備忘錄 - 通過電子郵件詳細說明您的問題/疑慮,然後按照老年人的建議使用合併解決方案。如果集中設計存在問題,則屏蔽:)。看看你的需求,我可能會用一組專用的線程 - 這些線程只在啓動時創建,並且一個線程比一個異步的狀態引擎更容易調試,而這個狀態引擎必須在需要做的事情時不斷髮布到池中。如果線程池沒有使用異步方法,則任何阻塞調用都會阻塞池線程,從而迫使系統創建更多線程:( – 2012-07-28 12:42:25
如果您的應用程序爲每個組創建一個線程,並且每個線程從自己的隊列中獲取數據,並且無限地運行,你實際上擁有一個固定的線程池,創建一個具有相同線程數量的「真實」線程池不會有太大的改變,使用「真實」線程池可以獲得的好處是隻需少量線程從所有隊列中選擇數據,並且如果線程池隊列中等待的任務太多,或者線程太多,空閒線程池可能會根據需要增長和縮小。 – 2012-07-28 13:24:53