net/context: Don't leak goroutines in Done example.
The current example leaks the DoSomethingSlow goroutine for an
arbitrarily long time. In a real server, that can lead to an
out-of-memory failure during events such as network outages; a
more careful version of that example would be too long for a
simple package doc.
Fortunately, there are other short, common patterns using Done
that don't leak and don't require a lot of explanation. Let's
use one of those instead.
Change-Id: I0ad0c6121d06b757a397e0e71be9e01ccfd75f77
Reviewed-on: https://go-review.googlesource.com/4490
Reviewed-by: Andrew Gerrand <adg@golang.org>
diff --git a/context/context.go b/context/context.go
index 60531fb..b3bc8bb 100644
--- a/context/context.go
+++ b/context/context.go
@@ -64,18 +64,21 @@
//
// Done is provided for use in select statements:
//
- // // CancelableOperation calls UncancelableOperation and returns as soon as
- // // it returns or ctx.Done is closed.
- // func CancelableOperation(ctx context.Context) (Result, error) {
- // c := make(chan Result, 1)
- // go func() { c <- UncancelableOperation() }()
- // select {
- // case res := <-c:
- // return res, nil
- // case <-ctx.Done():
- // return nil, ctx.Err()
- // }
- // }
+ // // Stream generates values with DoSomething and sends them to out
+ // // until DoSomething returns an error or ctx.Done is closed.
+ // func Stream(ctx context.Context, out <-chan Value) error {
+ // for {
+ // v, err := DoSomething(ctx)
+ // if err != nil {
+ // return err
+ // }
+ // select {
+ // case <-ctx.Done():
+ // return ctx.Err()
+ // case out <- v:
+ // }
+ // }
+ // }
//
// See http://blog.golang.org/pipelines for more examples of how to use
// a Done channel for cancelation.