一文读懂 .NET 中的高性能队列 Channel

介绍

System.Threading.Channels 是.NET Core 3.0 后推出的新的集合类型, 具有异步API,高性能,线程安全等特点,它可以用来做消息队列,进行数据的生产和消费, 公开的 Writer 和 Reader api对应消息的生产者和消费者,也让Channel更加的简洁和易用,与Rabbit MQ 等其他队列不同的是,Channel 是进程内的队列。

开始Channel之旅

创建一个 channel 非常简单,Channel 类公开的API支持创建无限容量和有限容量的 channel

 // 创建有限容量的channel var channel = Channel.CreateBounded<string>(100);// 创建无限容量的channel var channel = Channel.CreateUnbounded<string>();

这里需要注意的是,当你使用一个有限容量的 Channel 时,你需要指定容量的大小,还可以指定一个 BoundedChannelFullMode 的枚举类型,来告诉 channel 达到容量限制的时候,继续写入时应该怎么处理

public enum BoundedChannelFullMode
{ Wait, DropNewest,DropOldest,DropWrite
}

•Wait 是默认值,当 channel 容量满了以后,写入数据时会返回 false,直到channel有数据被消费了以后,才可以继续写入•DropNewest 移除最新的数据,也就是从队列尾部开始移除•DropOldest 移除最老的数据,也就是从队列头部开始移除•DropWrite 写入数据返回成功,但是转头就把刚才的数据丢了

// 创建有限容量的channel, 并指定容量达到最大的策略
var channel = Channel.CreateBounded<string>(new BoundedChannelOptions(100) 
{ FullMode = BoundedChannelFullMode.Wait 
});

生产数据

生产数据主要通过 Channel 提供的 Writer api, 常规的写入操作如下:

await channel.Writer.WriteAsync("hello");

Channel 还提供了 TryWrite() 方法,如果写入数据失败时会返回 false,WaitToWriteAsync() 方法会做非阻塞的等待,直到 Channel 允许写入新的数据时返回 true,同样的 Channel 关闭后会返回 false

消费数据

消费数据主要通过 Channel 提供的 Reader api, 常规的读取操作如下:

var item = await channel.Reader.ReadAsync();

同样的,Channel 提供了 TryRead() 尝试读取数据,WaitToReadAsync() 方法会做非阻塞的等待,直到 Channel 可以读取到数据时会返回 true,在 Channel 关闭后会返回 false,另外你可以通过 channel.Reader.Count 获取队列元素的数量。

在实际的使用场景中,可能需要一些后台任务,长时间的进行消费,那么你可以使用下边的方式

while (await channel.Reader.WaitToReadAsync())
{while (channel.Reader.TryRead(out var item)){Console.WriteLine(item);}
}

ReadAllAsync() 方法返回的是一个 IAsyncEnumerable<T> 对象,也可以用 await foreach 的方式来获取数据

await foreach(var item in channel.Reader.ReadAllAsync())
{Console.WriteLine(item); 
}

单一生产者和消费者

创建 Channel 时,可以设置 ChannelOptions 的 SingleWriter 和 SingleReader,来指定 Channel 时单一的生产者和消费者,默认都是 false,当设置了 SingleWriter = true 时, 会限制同一个时间只能有一个生产者可以写入数据, SingleReader = true 是同样的。

另外,如果只需要一个消费者的话,你应该设置 SingleReader = true, Channel 在内部做了一些优化,在读取时避免了锁操作,性能上有些许的提升。

性能

这里的基准测试我对比了三种类型,Channel, BufferBlock, BlockingCollection,分别写入了10000条数据,然后进行读取,发现 Channel 确实是表现比较好。

总结

Channel 实际上还是使用 ConcurrentQueue做的封装, 使用起来更方便,对异步更友好,另外,.NET 5 其中的 Quic 内部就使用了Channel,CAP 也在新版本中使用 Channel 替换掉了之前的 BlockingCollection,来实现进程内的队列。

官方介绍 https://devblogs.microsoft.com/dotnet/an-introduction-to-system-threading-channels

源码 https://github.com/dotnet/runtime/tree/main/src/libraries/System.Threading.Channels/src/System/Threading/Channels

CAP https://github.com/dotnetcore/CAP

Quic https://github.com/dotnet/runtime/tree/main/src/libraries/System.Net.Quic

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java字符数组初始化_Java 字符串(一)字符串初始化

一、String类概述1、概述java.lang.String类代表字符串。Java程序中所有的字符串文字(例如 "abc" )都可以被看作是实现此类的实例。String 是引用数据类型&#xff0c;不是基本数据类型。类String 中包括用于检查各个字符串的方法&#xff0c;比如用于比较字符串&…

一晚啪了5只喵,累到在医院打点滴,这中国喵把英国人看傻了 | 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅最近&#xff0c;一只叫xiaopi的中国猫在英国红了&#xff01;好多媒体都报道了它…“猫咪一夜连XX 5只母喵后&#xff0c;累到挂点滴”《LADbible》&#xff0c;《Mirror》都可以看到它疲惫的小脸蛋…在《每日邮报》&#xff0c;xiaop…

放假的第二天

嗯...今天是放假的第二天.感觉昨天过了好漫长的一天哦,长得都有好几年了....昨天早上和某军去爬山,蛮惊喜的实话的说,可是快到山顶的时候罗打电话给某军说高二化学(2)要照相,某军却骗她说他正和一男孩儿爬山,男孩儿.....我....纠结.....后来过了好久,我们终于从山上下来了,赶到…

Locations Section of OpenCascade BRep

Locations Section of OpenCascade BRep eryar163.com 摘要Abstract&#xff1a;本文结合OpenCascade的BRep格式描述文档和源程序&#xff0c;对BRep格式进行分析&#xff0c;详细说明BRep的数据组织形式。本文主要通过对BRep文件中的Locations部分的读写代码进行分析&#xff…

2007武汉.NET俱乐部沙龙-VS2008、WPF、Silverlight

即将进入2008年&#xff0c;激动人心的一年。微软也将活跃起来&#xff0c;讨论微软技术发展的最新趋势&#xff0c;产品与解决方案的商业价值&#xff0c;新技术对未来行业的影响&#xff0c;使您以饱满的激情碰撞2008&#xff01;与此同时&#xff0c;微软又带给开发人员什么…

java long to float_为什么Java中long可以自动转换成float

Java中&#xff0c;long型是64位的&#xff0c;float型是32位的。为什么long型可以自动转float型呢?这里就涉及到浮点数在内存中的存储问题了。对于byte&#xff0c;short&#xff0c;int&#xff0c;long四个整数类型而言&#xff0c;它们在内存中无一例外都是直接换算成二进…

C# 枚举(Enum)

在数学和计算机科学理论中&#xff0c;一个集的枚举是列出某些有穷序列集的所有成员的程序&#xff0c;或者是一种特定类型对象的计数。这两种类型经常&#xff08;但不总是&#xff09;重叠。[1] 是一个被命名的整型常数的集合&#xff0c;枚举在日常生活中很常见&#xff0c…

孙悟空都服输!波士顿动力最新逆天机器人视频,翻筋斗连拿大顶!

全世界只有3.14 %的人关注了青少年数学之旅刚刚&#xff0c;波士顿动力公司在YouTube发布了两段真正震撼的新视频&#xff1a;双足人形机器人Atlas展示倒立、360度翻跟头、旋转的跑酷Demo&#xff1a;More Parkour Atlas。四足机器人Spot的商业化广告宣传片&#xff1a;Spot La…

痛并快乐着

看到访问量不断增加&#xff0c;而且访问过的人数已经超过500人&#xff08;注意不是浏览次数&#xff0c;而是不同的人数&#xff09;&#xff0c;真有成就感。与此同时&#xff0c;申请网易联盟再次失败&#xff0c;决定好好写我自己的blog&#xff0c;不再去管他什么狗屁联盟…

C#实例:datagridview单元格合并

这是替C#微信交流群群友做的一个小实例&#xff0c;目的就是在datagridview选择对应行以后&#xff0c;点击button后获取对应行的ip&#xff0c;并执行相应的操作&#xff0c;其实我觉得这样的话button没必要非放置到datagridview里面的&#xff01;但是为了满足群友的需求&…

NO.106 需求的状态、研发阶段及注意事项。

为什么80%的码农都做不了架构师&#xff1f;>>> 禅道项目管理软件设计的需求有两个字段来跟踪它的变化&#xff0c;一个是需求的状态字段&#xff0c;一个是需求的研发阶段字段&#xff0c;下面来看下这两个字段。 一、需求的状态 需求状态(status)字段&#xff0c…

java实例化泛型_Java让泛型实例化的方法

泛型对象可以实例化吗&#xff1f;不可以&#xff0c;T tnew T()是不可以的&#xff0c;编译器会报错。由于泛型擦除&#xff0c;编译器在编译时无法确定泛型所对应的真实类型解决方法使用反射新建实例Type superclass getClass().getGenericSuperclass();ParameterizedType p…

几种人类设计的永动机,最后一个彻底服了!| 今日最佳

全世界只有3.14 %的人关注了青少年数学之旅众所周知&#xff0c;永动机是违反当前客观科学规律的概念&#xff0c;是永远不能够被制造出来的。下面这些都是人们根据不同原理设计出来的&#xff0c;看一看有什么神奇之处&#xff0c;最后一个是亮点&#xff01;▲达芬奇设计的永…

vista 中php4, php5 共存

由于有些开源PHP产品需要PHP4&#xff0c;因为不得不安装这个版本&#xff0c;如OSC2.1&#xff1b;而有些开源产品则使用PHP5&#xff0c;如wikipedia&#xff0c;因此为了同时开发 PHP4或PHP5的软件&#xff0c;则需要同时安装这两个版本的东西。 安装PHP4使用IIS的具体操作请…

剖析WPF依赖属性

这节来讲一下WPF中的依赖属性 (Dependency Property)。【了解属性和字段】我们知道&#xff0c;属性是面向对象语言中用来封装字段的外衣&#xff0c;它像是字段对外界的桥梁&#xff0c;我们可以通过属性来验证数据的合法性或控制对外的访问性等等。每个属性的背后都有其对应的…

Spring与SpringMVC集成出现的问题

这几天在学习SpringMVC,在与Spring集成时&#xff0c;出现了两个小问题&#xff0c;记录下来&#xff0c;提醒自己&#xff0c;同时如果大家遇到同样问题&#xff0c;能够帮助大家的话&#xff0c;那我就感到幸哉了&#xff01;1&#xff0e;java.lang.NullPointerExceptionSEV…

java drawline_Java Graphics.drawLine方法代码示例

import javax.microedition.lcdui.Graphics; //导入方法依赖的package包/类public void draw(Graphics g) {g.setColor(255, 255, 255);g.fillRect(0, 0, getWidth(), getHeight());g.setColor(200, 200, 200);int baseLineY;if (signal.baseLineY() > 0) {baseLineY (int)…

Active Directory的用户属性说明

Active Directory中User对象属性User Object User Interface Mapping The following tables identify the property pages supplied by the Active Directory Users and Computers snap-in. Each table identifies the user interface elements of the property page and the A…

柳传志与马云绸缪宏观经济“冬天影子”

春江水暖鸭先知。尽管认同中国经济的繁荣将继续保持10~20年&#xff0c;中国商界的领军者和经济学家上周六还是提醒企业必须警惕可能到来的调整。 “我为什么上市&#xff1f;一个很重要的原因&#xff0c;是我在准备‘过冬’。”12月8日&#xff0c;在“2007(第六届)中国企业领…

你在孩子身上偷的懒,终将会变成最大的遗憾

全世界只有3.14 %的人关注了青少年数学之旅我们来看一个非常有趣的统计&#xff1a;2007年—2016年全国高考状元父母职业统计最优秀的孩子大多数出自教师家庭。很家长说&#xff0c;教师有着和孩子一样的寒暑假&#xff0c;有着教书育人的先天优势&#xff0c;我们普通人工作忙…