Почему метод net / rpc / client Go требует буферизованного канала? - PullRequest
4 голосов
/ 06 августа 2020

Я не могу понять, почему метод требует, чтобы вы специально предоставляли буферизованный канал.

Из документации ,

fun c (* Клиент) Go

func (client *Client) Go(serviceMethod string, args interface{}, reply interface{}, done chan *Call) *Call

Go вызывает функцию асинхронно. Он возвращает структуру Call, представляющую вызов. Канал done сигнализирует о завершении вызова, возвращая тот же объект Call. Если done равно nil, Go выделит новый канал. Если не nil, то done должно быть буферизовано, иначе Go намеренно сканирует sh.

1 Ответ

2 голосов
/ 06 августа 2020

LeGE C ссылается на это в своем комментарии.

Копаясь дальше, вы найдете этот бит в клиенте. 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")
        }
    }
}

Из того, что вы можете видеть здесь, что библиотека ожидает, что вызов будет полностью асинхронным. Это означает, что канал done должен обладать достаточной пропускной способностью, чтобы полностью разделить два процесса (т. Е. Вообще не блокировать). неблокирующая работа канала.

...