做淘宝客网站有什么服务器上哪儿找做网站
做淘宝客网站有什么服务器,上哪儿找做网站,strikingly建站工具,成都网站建设公司浅谈今天给大家分享一个微软官方的好东西#xff1a;Channel。前言今天给大家分享一个微软官方的生产者/消费者方案的特性解决#xff1a;Channel。Channel在System.Threading.Channels命名空间下#xff0c;Core 2.1使用时#xff0c;需要从Nuget上安装。% dotnet add package… 今天给大家分享一个微软官方的好东西Channel。 前言今天给大家分享一个微软官方的生产者/消费者方案的特性解决Channel。Channel在System.Threading.Channels命名空间下Core 2.1使用时需要从Nuget上安装。% dotnet add package System.Threading.Channels
而在Core 3.0 preview 7开始就直接包含在框架中了。 这是一个相对较新的特性。从Core 2.1开始加入现在版本是5.0.0嗯这个版本号有点骗人Channel的第一个版本就是4.5.0。Channel能做什么逻辑上Channel实际就是一个高效的、线程安全的队列支持在生产者和消费者之间传递数据。利用Channel通过发布和订阅可以将生产者和消费者分开。生产者Producer负责接收请求并写入Channel而消费者Consumer为每个进入Channel的数据执行处理。这样做一方面可以使生产者和消费者并行工作来提高性能另一方面可以通过创建更多的生产者或消费者来提高应用的吞吐量。下面我们以一个实际例子来解释这个特性。创建ChannelChannel提供了一个静态Channel类提供了两个公开方法来创建两种类型的Channel。CreateUnbounded - 创建一个具有无限容量的Channel。CreateBounded - 创建一个具有有限容量的Channel。人通常来说这两种方式使用上没有太大的区别。实际应用中具体要看生产和消费的速度以及期望产生的结果。有限容量的Channel容量是有上限的到达上限后可以让生产者非阻塞等待消费者使用并释放Channel容量后再继续。这种方式好处是可以控制生产的速度控制系统资源的使用缺点也是。因为控制速度意味着生产速度会被限制甚至停止。而无限容量生产者可以全速进行生产。但也有缺点如果消费者的消费速度低于生产者Channel的资源使用会无限增加会有服务器资源耗尽的可能。 今天的例子我们使用无限Channel。var channel Channel.CreateUnboundedstring();
非常简单的一行代码就创建了一个无限容量的Channel。我们定义这个Channel用来保存字符串对象。创建方法是一个通用的工厂方法所以我们可以为需要使用的任何类型的对象和数据创建Channel。 Channel有两个属性阅读器返回ChannelReader写入器返回ChannelWriter。写入Channel使用写入器ChannelWriter可以对Channel进行写入操作。ChannelWriter提供了以下几个方法WriteAsync - 异步写入WaitToWriteAsync - 非阻塞等待直到有空间可写入时或Channel关闭时返回true/falseTryWrite - 尝试写入Complete - 标记Channel为关闭并不再写入数据到该ChannelTryComplete - 尝试标记Channel为关闭。这几个方法很容易理解就不解释了。在本文的例子里我用了await channel.Writer.WriteAsync(New message);
读取Channel使用阅读器ChannelReader从Channel进行数据的读取。也提供了几个方法ReadAsync - 异步读取ReadAllAsync - 异步读取Channel中的所有数据TryRead - 尝试读取WaitToReadAsync - 非阻塞等待直到有数据可读取或Channel关闭时返回true/false不同的消费者模式会用到不同的读取方法。这个根据经验来写就好。本文的例子中我是采用WaitToReadAsync和ReadAsync配合来使用的while (await ChannelReader.WaitToReadAsync())
{if (ChannelReader.TryRead(out var timeString)){/***/}
}
WaitToReadAsync是一个非阻塞等待在有消息可读或Channel关闭时才会唤醒并继续。考虑到有多个消费者的情况有可能别的线程已经进行了读取这儿使用TryRead进行读取操作。要注意数据的同步工作是由Channel进行管理的。Channel会确保多个消费者不会读到相同的数据。Channel同时也管理数据的次序。示例代码今天的示例代码我放到了Github上。链接是文章最后。这个例子中我做了三个场景。首先是Channel。我使用了无限Channel。然后是创建生产者和消费者。数据传输过程就简单化了生产者只简单将一个字符串写入到Channel。消费者也是简单等待并从Channel读取数据字符串写入控制台。三个场景分别是单一生产者/单一消费者这个例子中创建了一个生产者和一个消费者。两者的任务都是并发启动的。里面的延时是用来模拟工作负载的。多个生产者/单一消费者这个例子中有两个生产者。通常在应用中有多个生产者时我们需要确保生产与单个消费者所能处理的消息数量大致相当这样能更好地利用服务器资源。单一生产者/多个消费者这个其实是应用中最常见的情况就是产生消息很快但处理工作相关较慢而且工作也更密集。这种情况实际应用中我们可以通过扩大消费者数量来满足生产的需求。总结最近的项目在做一个大数据的采集用到了一些Channel的技术。然后发现网上这部分内容很少就做了个例子写了这个文章。Channel内容本身并不多但用着很方便而且实际应用中比想像的更强大。它可以简化很多生产者/消费者模式的使用而且任务间交换数据使用Channel会更方便更直接。 示例代码在https://github.com/humornif/Demo-Code/tree/master/0033/demo喜欢就来个三连让更多人因你而受益
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/88355.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!