Печать точного счетчика в golang при использовании goroutines

#go #goroutine

#Вперед #goroutine

Вопрос:

Итак, у меня настроены мои goroutines, которые ускоряют мои запросы в функции request . Я пытаюсь реализовать счетчик, который подсчитывает, сколько запросов было отправлено, но поскольку goroutines как бы «повторяет» процесс x раз, трудно создать точный счетчик. Есть ли какой-либо другой метод или кто-нибудь знает способ точно регистрировать количество отправленных запросов?

Код:

 func routine() {
    fmt.Println()
    rep := 1000
    results := make(chan string)

    for i := 0; i < rep; i   {
        go func(num int) {
            results <- request(num)
        }(i)
    }

    for i := 0; i < rep; i   {
        fmt.Println(<-results)
    }
}

...

func request(num int) string {
    client := amp;http.Client{}
    count_checks := 0 

    for {
        req, err := http.NewRequest("GET", "https://endpoint.com/users", nil)

        resp, err := client.Do(req)
        if err != nil {
            print(err)
        }

        defer resp.Body.Close()
        contents, err := ioutil.ReadAll(resp.Body)
        if err != nil {
            fmt.Printf("%s", err)
            os.Exit(1)
        }

        if contents != nil {
            count_checks  
            fmt.Println(count_checks)
    
        }
    }
}
 

Который выводит, как ожидалось (1000x на число):

 1
1
1
 

Ответ №1:

Вы можете использовать эту функцию для увеличения счетчиков в режиме сохранения в goroutine

https://pkg.go.dev/sync/atomic@go1.17.5#AddInt32

Примеры тривиальны

 // count_checks := 0 
var count_checks int64 = 0

// your code here
// count_checks   
sync.AddInt32(amp;count_checks, 1)