Go에서 HTTP 클라이언트를 테스트하려고합니다.Go - 특정 개수의 goroutine을 만들려고 할 때 세분화 위반이 발생했습니다.
처음에는 10 번의 반복에 대해 10 개의 동시 요청을 실행하려고했습니다.
// stress.go
package main
import (
"fmt"
"io/ioutil"
"net/http"
"time"
)
func MakeRequest(url string, ch chan<- string) {
start := time.Now()
resp, _ := http.Get(url)
secs := time.Since(start).Seconds()
body, _ := ioutil.ReadAll(resp.Body)
ch <- fmt.Sprintf("%.2f elapsed with response length: %d %s", secs, len(body), url)
}
func main() {
start := time.Now()
goroutines := 10
iterations := 10
ch := make(chan string)
url := "http://localhost:8000"
for i := 0; i < iterations; i++ {
for j := 0; j < goroutines; j++ {
go MakeRequest(url, ch)
}
}
for i := 0; i < goroutines*iterations; i++ {
fmt.Println(<-ch)
}
fmt.Printf("%.2fs elapsed\n", time.Since(start).Seconds())
}
그것은 반복하고 goroutines의 조합을 위해 잘 작동 :
여기 내 클라이언트 코드입니다.
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x48 pc=0x11eb9f0]
goroutine 7099 [running]:
main.MakeRequest(0x1271897, 0x15, 0xc420074120)
stress.go:16 +0xa0
created by main.main
stress.go:28 +0xb2
this에 따르면, 하나는 쉽게 만들 수 있습니다 goroutines와 반복 횟수가 일정 수준을 넘어 가면 goroutines의 수는 634 이상으로 갈 때, 내 경우에는, 단일 반복을 위해, 나는이 오류가 10000 개의 골 루틴. 내 경우에 내가 뭘 잘못하고 있니? 클라이언트가 지정된 반복 횟수 동안 동시에 만들 수있는 GET 또는 POST 요청의 최대 수를 테스트하려면 어떻게합니까?
당신은'http.Get'와'ioutil.ReadAll'에서 오류를 버리고 있습니다. 그래서 당신은 nil 포인터 역 참조를 얻고있는 것이 놀랍지는 않습니다; 유효한 가정이 아닌 경우 반환 값이 좋다고 가정합니다. – Adrian