我无法弄清楚为什么该方法需要您专门提供缓冲通道。从文档中,func (*Client) 去func (client *Client) Go(serviceMethod string, args interface{}, reply interface{}, done chan *Call) *CallGo 异步调用函数。它返回表示调用的 Call 结构。done 通道将通过返回相同的 Call 对象在调用完成时发出信号。如果 done 为 nil,Go 将分配一个新通道。如果非零,done 必须被缓冲,否则 Go 会故意崩溃。
1 回答
白板的微信
TA贡献1883条经验 获得超3个赞
LeGEC 在他们的评论中提到了这一点。
进一步挖掘,您会在 client.go 中找到这一点
func (call *Call) done() {
select {
case call.Done <- call:
// ok
default:
// We don't want to block here. It is the caller's responsibility to make
// sure the channel has enough buffer space. See comment in Go().
if debugLog {
log.Println("rpc: discarding Call reply due to insufficient Done chan capacity")
}
}
}
从这里你可以看到,库期望调用是完全异步的。这意味着完成通道必须有足够的容量来完全解耦两个进程(即完全没有阻塞)。
此外,当使用 select 语句时,它是执行非阻塞通道操作的惯用方式。
- 1 回答
- 0 关注
- 182 浏览
添加回答
举报
0/150
提交
取消
