Допустим есть несколько телефонных станций, с которых необходимо одновременно собирать информацию и писать ее в какую-нибудь БД.
Подскажите как лучше реализовать сие действие, т.к. сейчас единственное что приходит на ум:
в бесконечном цикле проходим по всем станциям. С помощью каналов ждем пока получим ответ от всех станций, идем дальше.
А хотелось бы, чтобы если первая и третья станция отвечают быстро - не ждать ответа второй и производить снова запрос к первой и третьей, и т.д.
Примерный код, для наглядности как это представлено сейчас:
func someRequest(phone string, ch chan bool) {
fmt.Println(phone)
//time.Sleep(time.Second * 5) //Долгая операция. Для разных phone - разная по времени выполнения
ch <- true
}
func main() {
var phones = [2]string{"foo", "bar"}
ch := make(chan bool) // канал
for {
fmt.Println("start request")
for _, phone := range phones{
go someRequest(phone, ch)
}
//ожидаем завершения всех каналов
for i:=0 ; i < len(phones); i++{
<-ch
}
fmt.Println("success")
}
}
И дополнительно, когда получили данные со станции в гоурутине, перед записью в базу нужно ли пользоваться Мьютексами, чтобы не создать конфликтов или каких то коллизий при записи в БД?