c# – 使用线程处理队列的最有效的方式

栏目: ASP.NET · 发布时间: 5年前

内容简介:看起来很合理我发现BlockingCollection是相当快的.我用它每秒处理数以万计的请求.如果您的应用程序是处理器绑定的,那么您可能不想创建比具有内核的更多的员工.当然,你不想创建比核心更多的工作人员.在四核机器上,如果您希望大部分时间花费在FFT上,那么四名工作人员将会吃掉所有的CPU.更多的工作人员只是意味着你有线程上下文切换来处理. TPL通常会为您平衡,但是如果您无法处理超过一个人,则无法创建100名工人.我建议你运行测试与3,4,5,6,7和8工人.看哪一个给你最好的吞吐量.

我有一个队列,在其上放置等待的傅立叶变换请求(相对耗时的操作) – 在某些情况下,我们可以每秒获得数千个转换请求,因此它必须快速.

我正在升级旧代码以使用.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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Android群英传

Android群英传

徐宜生 / 电子工业出版社 / 2015-9 / 69.00元

《Android群英传》对具有一定Android开发基础的读者,以通俗易懂的语言介绍了Android开发的进阶技巧。《Android群英传》共分为13章,讲解了Android体系与系统架构、Android开发工具新接触、Android控件架构与自定义控件详解、ListView使用技巧、Android Scroll分析、Android绘图机制与处理技巧、Android动画机制与使用技巧、Activi......一起来看看 《Android群英传》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换