Die meisten effizienten Art und Weise zu verarbeiten, die ein queue mit threads

Habe ich eine queue auf, die ausstehende fourier-Transformation-Anforderungen (vergleichsweise zeitaufwändige Operationen) platziert sind - wir könnten Tausende von transform-Anforderungen pro Sekunde in einigen Fällen so sein musst schnell sein.

Ich bin die Erneuerung der alten code zu verwenden .net 4, sowie die Portierung von TPL. Ich Frage mich, was die effektivsten (schnellsten Durchsatz) Weg, dies zu behandeln Warteschlange aussieht. Ich möchte die alle verfügbaren Kerne.

Derzeit bin ich Experimentieren mit einer BlockingCollection. Ich erstelle ein queue handler-Klasse, die spawns 4 Aufgaben, die block auf der BlockingCollection und warten auf die eingehenden arbeiten. Sie dann verarbeiten, die anstehende Transformation. Code:

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
    }

Sieht das aus wie eine gute Lösung? Es scheint, max, alle Kerne - obwohl ich bin mir derzeit nicht sicher, wie viele Arbeiter sollte ich spawn in meiner Konstruktor.

  • On a side note, Sie können auch die Intel IPP zur Beschleunigung der Fourier-transform-Arbeit (jeder thread läuft auf einem core wird dann die Nutzung der SSE-Anweisungen, die die Arbeit machen), aber dann haben Sie das Vergnügen interop 😉
InformationsquelleAutor Matt Roberts | 2011-06-01
Schreibe einen Kommentar