Как реализовать многопоточность в go?

Допустим есть несколько телефонных станций, с которых необходимо одновременно собирать информацию и писать ее в какую-нибудь БД.

Подскажите как лучше реализовать сие действие, т.к. сейчас единственное что приходит на ум:
в бесконечном цикле проходим по всем станциям. С помощью каналов ждем пока получим ответ от всех станций, идем дальше.

А хотелось бы, чтобы если первая и третья станция отвечают быстро - не ждать ответа второй и производить снова запрос к первой и третьей, и т.д.

Примерный код, для наглядности как это представлено сейчас:

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")
	}
}


И дополнительно, когда получили данные со станции в гоурутине, перед записью в базу нужно ли пользоваться Мьютексами, чтобы не создать конфликтов или каких то коллизий при записи в БД?
  • Вопрос задан
  • 699 просмотров
Решения вопроса 1
Можно создать канал для данных, которые надо писать в базу и по горутине на станцию, внутри каждой бесконечный цикл. Горутины постоянно читают каждая свою станцию и пишут в один канал данные, которые надо в БД заносить. Ещё одна горутина читает из этого канала через range и заносит данные в базу.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы