The recipe on 10:26 should work but it's definitely contrived - using Fetch 
looks strange to me, and the cancellation behavior of errgroup is another 
moving part that adds some overhead. If it's sufficient, Ian's solution 
groks better :)


On Sunday, May 21, 2023 at 7:38:31 AM UTC-7 Tobias Klausmann wrote:

> 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
> > <klau...@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/798d97ad-9483-4597-aeb1-dd60189aff17n%40googlegroups.com.

Reply via email to