调研Rust中等同于gochan的channel机制

不爱学习 2024-11-11 18:04:42

golang中的chan 通讯机制比较简单。是阻塞的。默认它的行为是,如果是有size的chan,比如make了4个size的chan,那它可以在被读取之前,写入4次,如果4次写完,你没有被取出塞进去的消息。那么就会阻塞。

我们看下rust中的实现。

在namespace std :: sync :: mpsc :: 下面,我们可以看到channel的两种实现,一种是完全阻塞的sync ,一种是全异步的。

sync channel会被阻塞。当你写了一个,但是没有消费。直到前面的被消费,后面的才会继续允许你写进去。

这个跟golang的就很像了

let (sender, receiver) = sync_channel(1);

语法很便捷,你可以在初始化的时候,指定size,这样你就跟golang一样,make 了n个size的位子,允许你最多写n个消息。

直到消息被消费。否则你是无法继续写的。

创建一个新的异步通道,返回发送方Sender, 接收方Receiver。在发送者上发送的所有数据在接收者这边看来将按照发送的顺序排列,并且不会阻塞发送端,你可以一直发消息(这个channel有一个“无限缓冲区”,不像 sync _ channel,它将在达到其缓冲区限制后阻塞,你就不能再发)。Recv 将一直阻塞,直到有至少一条消息可用,同时至少有一个发件人还活着(包括克隆)。

可以克隆发送方以多次发送到同一channel信道,但只支持一个接收方消费。

如果接收方在尝试与发送方一起发送时断开连接,则 send 方法将返回 SendError。类似地,如果在尝试 recv 时断开发件人的连接,recv 方法将返回 RecvError。

0 阅读:0