在 C中使用 Channel 实现生产者/消费者模式

中的通道基于消息传递的概念,这意味着生产者将消 在 C中使用 Channel 实  息发送到通道,消费者接收这些消息。消息可以是任何类型的,它们会存储在通道中,直到消费者准备好接收它们为止。通道还可以具有绑定容量,这意味着它们可以容纳固定数量的消息,然后阻止生产者,直到消费者为新消息腾出空间。

通过这种方式,通道提供了一种简单而强大的方法来实现程序不同部分之间的异步通信和协调,并且它们在 C# 和其他现代编程语言中越来越流行。

通道是使用 System.Threading.Channels 命名空间实现的,它提供了两种类型的通道,包括:

1.UnboundedChannel:这种类型的Channel可以容纳无限数量的消息。

2. BoundedChannel:这种类型的 Channel 只能容纳有 印度尼西亚赌博数据 限数量的消息。我们可以使用 BoundedChannelOptions.FullMode 配置队列已满时的行为。此外,该库还允许我们配置更多属性,例如:

– SingleWriter:这不会强制运行时只接受一个写入器,如果 Channel 中有多个写入器,则不会抛出异常。如果将此属性设置为 true,则 Channel 可能能够基于只有一个写入器的假设来优化某些操作。

– SingleReader:与 SingleWriter 相同,但用于读取端

– AllowSynchronousContinuations:指示是否可以同步调用延续。默认情况下,该选项为 false。我们应该小心谨慎,并在启用此标志之前和之后进行一些测量。

基本用法

为了使用 Channel,首先,我们通过 Channel 类型的静态方法创建一个 Channel 实例,如下所示。

 

图 01:创建 Channel 实例

在上面的例子中,我们创建了一个无界通道,可以发送 int 类型的消息。

 

图 02:使用 Channel 发送消息。

然后,我们可以在通道的写入器部分写入一些数据,并使用读取器部分读取数据。我们还可以在多线程上下文中使用通道进行同步。

 

图 03:在多线程上下文中使用 Channel。

上述代码创建了 2 个线程,第一个线程从通道读取,第二个线程向通道写入。只有在写入线程将值写入通道后,读取线程才能继续工作。我们可以将通道视为队列,在这种情况下,读取器尝试读取消息。在读取时,还没有消息。一旦消息从写入器到达,读取器就可以继续执行其任务。

无界通道

UnboundedChannel 是一种为 T 类型的消息提供无界缓 不要让异议阻止你 冲区的通道。它在 System.Threading.Channels 命名空间中可用,可用于创建可容纳无限数量消息的通道。UnboundedChannel 在无法提前知道生成的消息数量或生产者和消费者以不同的速度处理消息的情况下非常有用。但是,需要注意的是,如果生产率超过消耗率,无界通道可能会消耗大量内,存,因此应谨慎使用。

图 04:UnboundedChannel 示例

上述示例代码应打印出“已收到物品 0”,……“已收到物品 100”,就像写入相同的订单消息一样。

有界通道

与 UnboundedChannel 一样,BoundedChannel 也是 C# 中的一种通道类型。唯一的区别在于,它为类型 T 的消息提供固定大小的缓冲区。有界通道可用于以下场景:生产者生成数据的速度比消费者处理 柬埔寨号码 数据的速度快,或者消费者一次只能处理固定数量的项目。通过指定缓冲区大小的限制,有界通道可以帮助控制通道消耗的内存量。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部