内容简介:看起来很合理我发现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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 045.Python线程队列
- Callable,阻塞队列,线程池问题
- 面试官:线程池运行机制如何改为线程池满了,再丢队列?
- 数据结构与算法:队列:队列在线程池等有限资源池中的应用
- 任务与队列 iOS之多线程GCD(一)
- 踩坑 Spring Cloud Hystrix 线程池队列配置
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。