为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 net/rpc/client 的 Go 方法需要缓冲通道?

为什么 net/rpc/client 的 Go 方法需要缓冲通道?

Go
跃然一笑 2022-06-21 16:33:30
我无法弄清楚为什么该方法需要您专门提供缓冲通道。从文档中,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 语句时,它是执行非阻塞通道操作的惯用方式。


查看完整回答
反对 回复 2022-06-21
  • 1 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号