While trying to retrofit context.Context within a
worker-pool-patterned package, where work is sent down a channel to be
picked up by number of worker goroutines.
I'm running against the mantra of "Do not store Contexts inside a struct type".
For example, I want to put a timeout on the amount of time spent
waiting to write on a channel, plus the time it takes for my write to
be consumed on the other end (the time the requests spends enqueued on
the channel buffer). How would I go about doing that without embedding
a context.Context inside my write?
A typical example, here is how i would do it without the channel send:
func p(ctx context.Context, req Request) {
ctx, _ = context.WithTimeout(ctx, Timeout)
select {
case <-ctx.Done:
// timed out
default:
worker(ctx, req) // will use ctx to determine if timeout expired
}
}
With a channel I may do something like:
func c(req Request, in chan Request) {
in <- req
<-out
}
func worker(in chan Request) {
for _, v := range in {
// i want to cancel here if 'v' has lived past its timeout
// or do work if not
}
}
And I want to have a meaningful way to measure enqueue time before req
is consumed by a worker in the second example.
Hopefully that makes sense.
--
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].
For more options, visit https://groups.google.com/d/optout.