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

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

内容简介:看起来很合理我发现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


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

查看所有标签

猜你喜欢:

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

认知盈余

认知盈余

[美] 克莱·舍基 / 胡泳、哈丽丝 / 中国人民大学出版社 / 2011-12 / 49.80元

“互联网革命最伟大的思考者”克莱•舍基 继《未来是湿的》之后最新力作 看自由时间如何变革世界的未来 如果说《未来是湿的》揭示的是“无组织的组织力量”, 那么《认知盈余》揭示的就是 “无组织的时间力量”。 腾讯董事会主席兼首席执行官马化腾首度亲笔作序倾情推荐 克莱•舍基说,美国人一年花在看电视上的时间大约2 000亿个小时,而这几乎是2 000个维基百科项目一年所需要的......一起来看看 《认知盈余》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

html转js在线工具
html转js在线工具

html转js在线工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具