2011-04-26 38 views
0


我想用BlockingQueue構建一個通用生產者/消費者。
我希望它儘可能多線程或並行,但不要吃掉所有的計算機資源。
假設我們有一個生產者,是消費者作爲線程還是一個消費者更好? 消費數據時的任務?在仿製生產者/消費者中使用任務

while(true) 
{ 
    queue.TryTake(...) { Task.Factory.StartNew(...); } 
} 

Thread t = new Thread(Consumer.Start); 

回答

0

也許是一種組合。

你的第一個建議有一個問題,當Queue填滿時,你會開始很多任務,可能太多。

第二個將只使用1個線程(我認爲這就是你的意思)。

你或許應該開始n個使用者和設備的某些戰略N.這在很大程度上取決於工作量,使用I/O等

可能的策略是

  • N = NumberOfCores的( - 1)
  • 啓動一個新的消費者時Queue.Count>中號

而且你還不如用一個任務(LongRunning選項),而不是一個線程。

+0

稱爲「對許多」的任務量是多少? – guyl 2011-04-26 10:15:20

+0

@guy:當他們繼續疊加。小心不要將重量從阻塞(!)集合移動到任務隊列。 – 2011-04-26 10:28:35

+0

明白了..這是一個很好的想法,我沒有想過。 – guyl 2011-04-26 10:32:16

0

如果你擔心計算機資源的解決方案可能會做的工作線程池,所有監控任務隊列,一旦任務被提上隊列和一個工作線程是免費的,它從隊列中讀取它並開始工作?

這應該很容易設置。

//丹尼爾

+0

解決方案只是給全局線程池做任務的工作,不是嗎? – guyl 2011-04-26 10:29:02

+0

當然,這是一個辦法。除了對隊列進行一些監控之外,可以將工作分派給線程池。至少如果這些任務不是太長時間的運行。 – Daniel 2011-04-26 10:58:51