接收器始终阻塞,直到有数据要接收.如果通道未缓冲,则发送方将阻塞,直到接收方收到该值.
但signal.Notify将信号中继到无缓冲信道而不会阻塞.这是如何工作的,是否可以与其他陈< - 类型一起使用?
当它表示os.Notify不会阻止时,它意味着如果阻止它将丢弃消息.因此,虽然它不会阻塞,但如果无法立即接收信号,它将传递信号并不是真的.这可以通过以下方式完成select:
select {
case channel <- message:
// message sent
default:
// message dropped
}
Run Code Online (Sandbox Code Playgroud)
这就是Notify明确说明您应该使用缓冲通道的文档的原因.另请注意,缓冲通道也可以阻塞,而不仅仅是无缓冲通道; 缓冲通道仅在缓冲区已满时阻止.
你总是可以避免阻塞,同时(可能)仍然通过使用另一个 goroutine 保证交付:
go func() { channel <- message }()
Run Code Online (Sandbox Code Playgroud)
当然,这只是使用 goroutine 调度程序作为通道的替代缓冲区,这可能明智也可能不明智。