我正在尝试在golang GCP Cloud函数中使用goroutine,使用或不使用goroutine进行身份验证代码,都会收到不同的结果。
我正在调用一个函数“ Instance()”,该函数发出HTTPS GET请求。如果在没有goroutine的情况下调用该函数,则所有操作均按预期进行。如果使用goroutine'go Instance()'调用该函数,则对于相同的调用,我会收到'TLS握手超时'。
我认为TLS和并发性存在问题,但是找不到任何信息。
func GoRoutineTest(w http.ResponseWriter, r *http.Request) {
defaultRoundTripper := http.DefaultTransport
defaultTransportPointer, ok := defaultRoundTripper.(*http.Transport)
if !ok {
panic(fmt.Sprintf("defaultRoundTripper not an *http.Transport"))
}
defaultTransport := *defaultTransportPointer // dereference it to get a copy of the struct that the pointer points to
defaultTransport.TLSHandshakeTimeout = 10 * time.Second
defaultTransport.MaxIdleConns = 100
defaultTransport.MaxIdleConnsPerHost = 100
client = &http.Client{Transport: &defaultTransport}
for i := 0; i < 8; i++ {
Instance() /* This works as expected */
go Instance() /* This fails with 'TLS handshake timeout' */
}
}
func Instance( ) {
resp, err := client.Get("https://google.com")
if err != nil {
fmt.Println(err)
} else {
defer resp.Body.Close()
if resp.StatusCode == http.StatusOK {
bodyBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
}
fmt.Println(resp.StatusCode)
bodyString := string(bodyBytes)
fmt.Println(bodyString)
}
}
}