From 560c0ed0d4af6a92e364606adebf230a07d4a713 Mon Sep 17 00:00:00 2001 From: Oshank Kumar Date: Wed, 24 May 2023 21:47:54 +0530 Subject: [PATCH] Use unbuffered chan in parallel func for processesing the data Channels should usually have a size of one or be unbuffered. It prevents the channel from filling up under load. Refer https://github.com/uber-go/guide/blob/master/style.md#channel-size-is-one-or-none for more details. Signed-off-by: Oshank Kumar --- utils.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/utils.go b/utils.go index f650c05..97cfec1 100644 --- a/utils.go +++ b/utils.go @@ -32,11 +32,16 @@ func parallel(start, stop int, fn func(<-chan int)) { procs = count } - c := make(chan int, count) - for i := start; i < stop; i++ { - c <- i - } - close(c) + c := make(chan int) + done := make(chan struct{}) + + go func(c chan<- int) { + defer close(done) + for i := start; i < stop; i++ { + c <- i + } + close(c) + }(c) var wg sync.WaitGroup for i := 0; i < procs; i++ { @@ -46,6 +51,8 @@ func parallel(start, stop int, fn func(<-chan int)) { fn(c) }() } + + <-done wg.Wait() }