背景
在使用goroutine的时候,有时候需要控制goroutine执行的时间。这时候需要使用到 一些技巧。
这个时候可以使用 select 和 time.After 进行处理。
来源
import "time"
c := make(chan error, 1)
go func() { c <- client.Call("Service.Method", args, &reply) } ()
select {
case err := <-c:
// use err and reply
case <-time.After(timeoutNanoseconds):
// call timed out
}
注意: 通道c的缓冲区大小是1。如果是非缓冲通道和客户端。调用方法所花费的时间超过了 timeoutNanoseconds,通道发送将永远阻塞,goroutine将永远不会被销毁。
上述是涉及到的超时控制在后续的版本中可以使用 context 进行超时控制。以及使用 sync.WaitGroup 控制 goroutine的完成情况。