c# – 使用執行緒處理佇列的最有效的方式
我有一個佇列,在其上放置等待的傅立葉變換請求(相對耗時的操作) – 在某些情況下,我們可以每秒獲得數千個轉換請求,因此它必須快速.
我正在升級舊程式碼以使用.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 }
這看起來好像是一個很好的解決方案嗎?它似乎最大限度地減少所有核心 – 儘管我目前不確定我應該在我的建構函式中產生多少個工作.
看起來很合理我發現BlockingCollection是相當快的.我用它每秒處理數以萬計的請求.
如果您的應用程式是處理器繫結的,那麼您可能不想建立比具有核心的更多的員工.當然,你不想建立比核心更多的工作人員.在四核機器上,如果您希望大部分時間花費在FFT上,那麼四名工作人員將會吃掉所有的CPU.更多的工作人員只是意味著你有執行緒上下文切換來處理. TPL通常會為您平衡,但是如果您無法處理超過一個人,則無法建立100名工人.
我建議你執行測試與3,4,5,6,7和8工人.看哪一個給你最好的吞吐量.
http://stackoverflow.com/questions/6203836/most-efficient-way-to-process-a-queue-with-threads