in upload/concurrent/balancer.go [62:93]
func (b *Balancer) Run(requestChan <-chan *Request) (<-chan error, <-chan bool) {
// Request dispatcher
go func() {
for {
requestToHandle, ok := <-requestChan
if !ok {
b.closeWorkersRequestChannel()
return
}
b.dispatch(requestToHandle)
}
}()
// listener for worker status
go func() {
remainingWorkers := b.workerCount
for {
select {
case w := <-b.requestHandledChan:
b.completed(w)
case _ = <-b.workerFinishedChan:
remainingWorkers--
if remainingWorkers == 0 {
b.allWorkersFinishedChan <- true // All workers has been exited
return
}
}
}
}()
return b.errorChan, b.allWorkersFinishedChan
}