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


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

查看所有标签

猜你喜欢:

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

赢在众筹

赢在众筹

杨东、黄超达、刘思宇 / 中国经济出版社 / 2015-1-1 / 48.00

第一本股权众筹体系化图书。李克强总理要求“开展股票众筹融资试点”。人民大学杨东教授,天使街黄超达、刘思宇两位老总倾情创作。阿里巴巴、平安集团、京东等多家机构联袂推荐一起来看看 《赢在众筹》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

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

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具