Почему нет вывода результата функции в консоль при использовании Go-рутин?

Насколько я понимаю основной поток у меня завершается быстрее, чем отработают рутины, но не понимаю как синхронизировать.
package main

import (
	"fmt"
	"net/http"
	"time"
)

func getResp()  {
	res, err := http.Get("http://ya.ru")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(res.Status)

}

func main() {
	start := time.Now()
	for i := 0; i < 10; i++ {
		go getResp()

	}
	elapsed := time.Since(start)
	fmt.Println("Время выполнения  ", elapsed)
}


Насколько я понимаю вся проблема это в fmt.Println(res.Status) , пробовал убрать вывод из функции и вызвать в main через анонимную -
package main

import (
	"fmt"
	"net/http"
	"time"
)

func getResp()string  {
	res, err := http.Get("http://ya.ru")
	if err != nil {
		fmt.Println(err)
	}
	return res.Status

}

func main() {
	start := time.Now()
	for i := 0; i < 10; i++ {
		go func() {fmt.Println(getResp())}()

	}
	elapsed := time.Since(start)
	fmt.Println("Время выполнения  ", elapsed)
}


Результат тот-же - время выполнения есть, а вот статусов в консоли нет. Походу нужна синхронизация, только вот как и куда не могу понять.
  • Вопрос задан
  • 231 просмотр
Решения вопроса 1
mututunus
@mututunus
Backend developer (Python, Golang)
package main

import (
	"fmt"
	"net/http"
	"sync"
	"time"
)

var wg sync.WaitGroup

func getResp() {
	defer wg.Done()
	res, err := http.Get("http://ya.ru")
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(res.Status)
	}
}

func main() {
	start := time.Now()
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go getResp()

	}
	wg.Wait()
	elapsed := time.Since(start)
	fmt.Println("Время выполнения  ", elapsed)
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Вот тут есть пример
Ответ написан
Комментировать
mrakodav
@mrakodav Автор вопроса
Спасибо Andrey Kot , у меня получилось более жутковато
package main

import (
	"fmt"
	"net/http"
	"sync"
	"time"
)

func getResp() string {
	res, err := http.Get("http://ya.ru")
	if err != nil {
		fmt.Println(err)
		time.Sleep(1)
	}
	return res.Status
}

func main() {
	start := time.Now()
	countThread := &sync.WaitGroup{}
	for i := 0; i < 10; i++ {
		countThread.Add(1)
		go func(cT *sync.WaitGroup) {
			fmt.Println(getResp())
			cT.Done()
		}(countThread)
	}
	countThread.Wait()
	elapsed := time.Since(start)
	fmt.Println("Время выполнения  ", elapsed)
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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