我有一个队列,可以在其上放置未决的傅立叶变换请求(相对耗时的操作) - 在某些情况下,我们可以每秒获得数千个转换请求,因此它的速度要快。使用线程处理队列的最有效方法
我正在升级旧代码以使用.net 4,以及移植到TPL。我想知道处理这个队列的最有效(最快的吞吐量)方式是什么样子。我想使用所有可用的内核。
目前我正在尝试使用BlockingCollection。我创建了一个队列处理器类,它产生了4个任务,这些任务阻塞了BlockingCollection并等待传入的工作。然后他们处理该待处理的转换。代码:
public class IncomingPacketQueue : IDisposable
{
BlockingCollection<IncomingPacket> _packetQ = new BlockingCollection<IncomingPacket>();
public IncomingPacketQueue(int workerCount)
{
for (int i = 0; i < workerCount; i++)
{
Task.Factory.StartNew(Consume);
}
}
public void EnqueueSweep(IncomingPacket incoming)
{
_packetQ.Add(incoming);
}
private void Consume()
{
foreach (var sweep in _packetQ.GetConsumingEnumerable())
{
//do stuff
var worker = new IfftWorker();
Trace.WriteLine(" Thread {0} picking up a pending ifft".With(Thread.CurrentThread.ManagedThreadId));
worker.DoIfft(sweep);
}
}
public int QueueCount
{
get
{
return _packetQ.Count;
}
}
#region IDisposable Members
public void Dispose()
{
_packetQ.CompleteAdding();
}
#endregion
}
这看起来像一个很好的解决方案吗?它似乎最大限度地利用了所有内核 - 尽管我目前不确定我应该在构造函数中产生多少工人。
在一个侧面说明,你也可以使用英特尔IPP用来加快傅立叶变换工作(然后每个线程在一个内核上运行将使用SSE指令做这项工作),但是然后你有互操作的乐趣;-) – 2011-06-01 17:13:46