作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
假设我有一个 goroutine,它从一个 channel 读取数据并写入另一个 channel 。
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
for num := range ch1 {
ch2 <- num+1
}
}()
如果 ch2
被阻塞,goroutine 仍会从 ch1
读取一个值,有效地在 channel 中引入一个缓冲区 1。由于我正在使用 channel 来控制流,所以我不需要任何缓冲。
如何制作一个以完全锁步方式执行的管道?或者换句话说,如何在一个原子操作中将值从一个 channel 传输到下一个 channel ?
我基本上想等待 ch1
和 ch2
都在会合点。
最佳答案
你不能用 2 个 channel 来做到这一点。为了在 ch2
上执行发送,要发送的值必须已经准备好并已评估。 Spec: Send statements:
Both the channel and the value expression are evaluated before communication begins.
所以即使你这样做,似乎也不会缓冲任何变量中的值:
ch2 <- (<- ch1)
不过,来自 ch1
的接收将首先被评估,然后才会尝试发送。
这意味着该值必须已经从 ch1
接收到。但是你无法判断是否有人在 ch2
上“监听”(意味着 ch2
上的发送是否可以继续)而不尝试发送 ch2
(即使可以,也不能保证在检查后尝试发送仍然会有人在监听)。
关于go - 如何在没有隐式缓冲区的情况下将值从一个 Go channel 传输到另一个 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51394957/
我是一名优秀的程序员,十分优秀!