RPC有超时机制吗?

Ani*_*edi 5 rpc go

如果RPC没有超时机制,如果它试图调用已关闭的服务器的RPC方法,如何"终止"RPC调用?

Seb*_*ian 8

您可以使用通道来实现超时模式:

import "time"

c := make(chan error, 1)
go func() { c <- client.Call("Service", args, &result) } ()
select {
  case err := <-c:
    // use err and result
  case <-time.After(timeoutNanoseconds):
    // call timed out
}
Run Code Online (Sandbox Code Playgroud)

select会阻塞,直到client.Call返回或timeoutNanoseconds经过.

  • 塞巴斯蒂安,如果RPC服务器不响应,goroutine可能永远在client.Call()中阻塞。这将导致goroutines泄漏。 (2认同)
  • 至少在Go 1.5中,有一个client.Go方法是更可取的 (2认同)