From ff55e2f0551d6d392edb5302c27a1f6cc88b5082 Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Sat, 7 Oct 2017 16:42:20 +0200 Subject: [PATCH] Get rid of wait groups --- src/numbers/numbers.go | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/src/numbers/numbers.go b/src/numbers/numbers.go index eb5471f..c41fc4e 100644 --- a/src/numbers/numbers.go +++ b/src/numbers/numbers.go @@ -10,7 +10,6 @@ import ( "net/http" "net/url" "numbers/sort" - "sync" "time" ) @@ -64,13 +63,10 @@ func numbersHandler(w http.ResponseWriter, r *http.Request) { // Non-blocking channel for sorted results sortChan := make(chan []int, len(rurl)) - var wg sync.WaitGroup // fetch all URLs asynchronously and sort them for i := range rurl { - wg.Add(1) go func(url string) { - defer wg.Done() n, e := getNumbers(url, ctx) if e == nil { // we have a usable JSON list of numbers @@ -89,30 +85,29 @@ func numbersHandler(w http.ResponseWriter, r *http.Request) { } }(rurl[i]) } - // master routine closing the inputChan - go func() { - wg.Wait() - close(sortChan) - }() // result list that is returned on short-circuit var resultList []int = []int{} + // counter of how many merge operations have been performed + mc := 0 + // get all sorted lists concurrently and merge them as we go - done := false - for done != true { +Outer: + for { select { case <-ctx.Done(): log.Printf("Waiting for URL took too long, finishing response anyway") finishResponse(w, resultList) return - case res, more := <-sortChan: - if more { - merged := sort.MergeLists(resultList, res) - resultList = merged - } else { - log.Printf("Nothing else to sort") - done = true + case res := <-sortChan: + merged := sort.MergeLists(resultList, res) + resultList = merged + mc += 1 + // if we have len(rurl) merge operations, then + // all lists have been processed already + if mc >= len(rurl) { + break Outer } } }