2011-04-26 84 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