想象一下,我有一个goroutine,它从一个通道读取并写入另一个通道。
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
for num := range ch1 {
ch2 <- num+1
}
}()
如果ch2
被阻止,goroutine仍将从ch1
读取一个值,从而在通道中有效地引入了1的缓冲区。由于我将通道用于控制流,因此我不需要任何缓冲。
如何制作以完全锁步方式执行的管道? 或者换种说法,如何在一个原子操作中将值从一个通道转移到下一个通道?
我基本上想等待ch1
和ch2
都在集合点。
答案 0 :(得分:1)
您不能使用2个频道进行此操作。为了在ch2
上执行发送,要发送的值必须已经准备好,已评估。 Spec: Send statements:
在开始通信之前先评估通道和值表达式。
因此,即使您这样做,似乎也不会在任何变量中缓冲该值:
ch2 <- (<- ch1)
仍然,将首先评估来自ch1
的接收,然后才尝试发送。
这意味着必须已经从ch1
接收到值。但是您无法确定是否有人在ch2
上“监听”(意味着是否可以继续进行ch2
的发送)而没有尝试发送ch2
(即使可以的话)无法保证检查后尝试发送仍会有人在听。)