Get rid of wait groups
This commit is contained in:
parent
9476a00648
commit
ff55e2f055
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user