My favorites | Sign in
Project Home Wiki
Search
for
Timeouts  
Timeouts and Deadlines
time, rpc, select
Updated May 22, 2011 by bradfitz@golang.org

Timeouts and Deadlines

To abandon synchronous calls that run too long, use the select statement with time.After:

import "time"

c := make(chan os.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

Powered by Google Project Hosting