On Wednesday, 8 July 2020 11:17:56 UTC+1, Andrei Tudor Călin wrote:
>
> I think this works for some cases, but it is potentially wasteful (and
> even leaky) in terms of resource usage.
>
> For example, if ctx is context.Background(), it leaks a goroutine for
> every connection
>
If this is a network server, that's easily fixed: you make a new ctx for
each connection (derived from the main one), and cancel it just before the
connection is closed. I think it's useful anyway to have a context which
covers the lifetime of that connection.
> It also keeps the additional goroutine around for the entire lifetime of
the connection.
Goroutines are cheap.
How about the following?
type Deadliner interface {
SetDeadline(t time.Time) error
}
func addContext(ctx context.Context, d Deadliner) {
go func() {
<-ctx.Done()
d.SetDeadline(time.Now())
}()
}
func handleConnection(ctx context.Context, conn net.Conn) {
ctx, cancel := context.WithCancel(ctx)
defer cancel()
addContext(ctx, conn)
... rest of code goes here
}
That seems pretty clean to me. My only concern is there's a possibility of
calling SetDeadline on an already-closed connection, and whether that would
cause a panic.
>
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/aa0eaf7a-27a8-4dc0-a6d7-245317cc4187o%40googlegroups.com.