mar*_*man 2 channel go blocking
我只想在某个通道阻塞等待数据到来时继续执行(阻塞通道是工作例程的一部分,应该并行运行)。
喜欢:
func foo(c chan bool) {
go start_blocking(c)
// only come here, when channel c actually blocks!
}
func start_blocking(c chan bool) {
<-c
}
Run Code Online (Sandbox Code Playgroud)
如何实现这一目标?
目的:
通道正在等待稍后的数据到来,并且在主执行继续之前它应该在后台准备好。
如果没有实际接收到某个频道,您就无法“窥视”该频道。因此,如果您确实需要此功能,渠道并不是一个好工具。如果您有缓冲通道,您当然可以通过检查其长度(len(ch))来检查其缓冲区中是否有值,但如果您随后尝试执行此操作,则不能保证仍然可以接收到该值。
如果您确实需要此功能,请使用计数器代替原子读取和写入。可以读取计数器的值而不递减它。
如果你确实需要一个通道,使用selectwith defaultcase 就足够了:你可以进行非阻塞发送和接收,如果发送或接收会阻塞,则 casedefault将在不阻塞的情况下执行。