| # Timeouts and Deadlines |
| |
| To abandon synchronous calls that run too long, use the select statement with 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 |
| } |
| ``` |
| |
| Note that the channel ` c ` has a buffer size of 1. If it were an unbuffered channel and the client.Call method took more than ` timeoutNanoseconds `, the channel send would block forever and the goroutine would never be destroyed. |
| |
| ## References |
| |
| time.After: http://golang.org/pkg/time/#After |
| |
| select: http://golang.org/doc/go_spec.html#Select_statements |
| |
| blog post: http://blog.golang.org/2010/09/go-concurrency-patterns-timing-out-and.html |