如何实现对非缓冲通道的非阻塞写入?

斯里达(Sridhar):

有效出发

接收器始终阻塞,直到有数据要接收为止。如果通道未缓冲,则发送方将阻塞,直到接收方收到该值为止。

但是signal.Notify将信号中继到无缓冲通道而不会阻塞。这是如何工作的,是否可以与其他chan <-类型一起使用?

阿德里安:

它说os.Notify不会被阻止的意思是,如果被阻止,则消息将被丢弃。因此,虽然它确实不会阻塞,但如果不能立即接收到信号,它将中继信号也不是正确的。这是通过简单的完成的select

select {
    case channel <- message:
        // message sent
    default:
        // message dropped
}

这就是为什么文档中Notify明确指出应使用缓冲通道的原因。还要注意,缓冲通道也可以阻塞,而不仅仅是非缓冲通道。仅当缓冲区已满时,缓冲的通道才会阻塞。

select包括在行程规格中

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章