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

Sri*_*har 3 go

Effective Go开始

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

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

Adr*_*ian 9

当它表示os.Notify不会阻止时,它意味着如果阻止它将丢弃消息.因此,虽然它不会阻塞,但如果无法立即接收信号,它将传递信号并不是真的.这可以通过以下方式完成select:

select {
    case channel <- message:
        // message sent
    default:
        // message dropped
}
Run Code Online (Sandbox Code Playgroud)

这就是Notify明确说明您应该使用缓冲通道的文档的原因.另请注意,缓冲通道也可以阻塞,而不仅仅是无缓冲通道; 缓冲通道仅在缓冲区已满时阻止.

select旅游规格中涵盖.


Jer*_*amp 6

你总是可以避免阻塞,同时(可能)仍然通过使用另一个 goroutine 保证交付:

go func() { channel <- message }()
Run Code Online (Sandbox Code Playgroud)

当然,这只是使用 goroutine 调度程序作为通道的替代缓冲区,这可能明智也可能不明智。

  • 挑剔:如果没有人碰巧从通道中读取数据,这个通道和阻塞的 goroutine 不会在内存中(直到程序结束)吗? (3认同)