В чем разница между net / rpc .Call против .Go? - PullRequest
0 голосов
/ 06 декабря 2018

Я только начинаю с Golang и пакета net / rpc.Я пытаюсь понять, когда вы можете использовать асинхронный вызов client.Go () над методом client.Call (), который используется в большинстве примеров в Интернете.Будет ли вызывать client.Call асинхронно через что-то вроде

go client.Call(...)

по сути то же самое, что и вызов client.Go?Я также видел этот пример в Интернете (например, при вызове нескольких одновременных RPC).

1 Ответ

0 голосов
/ 06 декабря 2018

Как задокументировано :

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

Это означает, что он выдает команду , но не ожидает ее завершения .

By контраст :

Вызов вызывает именованную функцию, ожидает ее завершения и возвращает статус ошибки.

Ни один из методов не выполняется в goroutine напрямую * - это оставляется в качестве упражнения для вызывающей стороны (поэтому можно привести аргумент, что Go является неправильным).

Если вы посмотрите на источник к Call, возможно, это более понятно:

func (client *Client) Call(serviceMethod string, args interface{}, reply 
interface{}) error {
    call := <-client.Go(serviceMethod, args, reply, make(chan *Call, 1)).Done
    return call.Error
}

Так что на самом деле Call является оберткой вокруг Go, которая ожидает завершения операции, тогда как Goявляется базовой функцией, которая оставляет ожидание до вызывающей стороны.

* Очевидно, что в фоновом режиме где-то задействована программа, так как это неблокирующая операция.

...