如何在没有隐式缓冲区的情况下将值从一个 Go 通道传输到另一个通道?
How can I transfer a value from one Go channel to another without an implicit buffer?
假设我有一个从一个通道读取并写入另一个通道的 goroutine。
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
for num := range ch1 {
ch2 <- num+1
}
}()
如果 ch2
被阻塞,goroutine 仍然会从 ch1
中读取一个值,有效地在通道中引入一个缓冲区 1。因为我正在使用通道来控制流,所以我不需要任何缓冲。
如何制作以完全锁步方式执行的管道?
或者换句话说,如何在一个原子操作中将值从一个通道传输到下一个通道?
我基本上想等待 ch1
和 ch2
都在集合点。
您不能使用 2 个频道执行此操作。为了在 ch2
上执行发送,要发送的值必须已经准备好并已评估。 Spec: Send statements:
Both the channel and the value expression are evaluated before communication begins.
因此,即使您这样做,似乎也不会缓冲任何变量中的值:
ch2 <- (<- ch1)
仍然会首先评估来自 ch1
的接收,然后才会尝试发送。
这意味着必须已经从 ch1
收到该值。但是如果不尝试在 ch2
上发送(即使你可以, 不能保证在检查后尝试发送仍有人在监听它)。
假设我有一个从一个通道读取并写入另一个通道的 goroutine。
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
for num := range ch1 {
ch2 <- num+1
}
}()
如果 ch2
被阻塞,goroutine 仍然会从 ch1
中读取一个值,有效地在通道中引入一个缓冲区 1。因为我正在使用通道来控制流,所以我不需要任何缓冲。
如何制作以完全锁步方式执行的管道? 或者换句话说,如何在一个原子操作中将值从一个通道传输到下一个通道?
我基本上想等待 ch1
和 ch2
都在集合点。
您不能使用 2 个频道执行此操作。为了在 ch2
上执行发送,要发送的值必须已经准备好并已评估。 Spec: Send statements:
Both the channel and the value expression are evaluated before communication begins.
因此,即使您这样做,似乎也不会缓冲任何变量中的值:
ch2 <- (<- ch1)
仍然会首先评估来自 ch1
的接收,然后才会尝试发送。
这意味着必须已经从 ch1
收到该值。但是如果不尝试在 ch2
上发送(即使你可以, 不能保证在检查后尝试发送仍有人在监听它)。