#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)