亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 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 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號