Hi! 

First off, thanks both Ian and Andrew!

On Sat, 20 May 2023, Ian Lance Taylor wrote:
> On Sat, May 20, 2023 at 1:23 AM Tobias Klausmann
> <klaus...@schwarzvogel.de> wrote:
> >   What I wonder about is the collection stage: the assumption that there
> >   will be exactly as many results as inputs seems brittle, and the only
> >   real way to handle errors is to put them into the result struct and
> >   examining them later.
> >
> >   I also usually prefer handling workers with a `waitgroup`, but that only
> >   really works if there is no return channel to handle, either because
> >   the workers do the output/final processing, or because results are
> >   written to a global. The former is not always possible, and the latter
> >   is ugly.
> >
> >   There is also the option of just making the result channel big enough
> >   to hold all results, but that seems a bit ugly as well.
> >
> >   So what's the most idiomatic way of doing this?
> 
> The pattern I tend to prefer is
> 
>     rc := make(chan result, numprocs)
>     var wg sync.WaitGroup
>     for i := 0; i < numprocs; i++ {
>         wg.Add(1)
>         go func() {
>             defer wg.Done()
>             sendResults(rc)
>         }()
>     }
>     go func() {
>         wg.Wait()
>         close(rc)
>     }()
> This ensures that the channel is closed when all the results are sent.
> Then you can collect the results using one or more goroutines with
> "for result := range rc".
> 
> Note that for this kind of pattern it's usually a good idea to use a
> buffered channel to hold the results, to avoid tight synchronization
> between the senders and the processors.  Of course sometimes you want
> that tight synchronization, but usually you don't.  The exact size of
> the buffer doesn't matter too much.

I'm now using this approach, and my mind is much more at ease about the
robustness. As for the channel size, I've tried numproc, *2, *10 and
*100, and it all makes no practical difference time-wise, so I'll just stay
with numproc

> You may also want to watch Bryan's talk at
> https://www.youtube.com/watch?v=5zXAHh5tJqQ .

Started watching and tried the recipe outlined/on screen at 10:26, but
couldn't get it to work: the result-gathering loop reading from c would
do zero iterations. Not sure what was going on ther. But the above
solution is one I grok, so I'm staying with that :)


Best,
Tobias

-- 
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 golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/ZGosu5Ly9xo2KtSr%40skade.schwarzvogel.de.

Reply via email to