gpt4 book ai didi

go - 为什么 golang 中的线程使用量随着网络 IO 的增加而增加?

转载 作者:IT王子 更新时间:2023-10-29 01:56:33 59 4
gpt4 key购买 nike

我创建了一个测试程序来检查我对 Golang 如何处理网络 IO 的理解。下面的程序创建了 1000 个 goroutine,在每个 goroutine 中,它都会发出一个网络 IO 请求。

当我尝试监视正在使用的线程数时,它上升到 400 个线程。我之前用top命令监控,我的理解是对于network io Golang使用netpoll(即async io)。

如果我的理解有误,请指正。

操作系统:macOS high sierra

Go版本:go1.11.2 darwin/amd64

package main

import (
"encoding/json"
"log"
"net/http"
"sync"
"time"
)

func main() {
timeout := time.Duration(5 * time.Second)
client := http.Client{
Timeout: timeout,
}
var wg sync.WaitGroup

start := time.Now()
for i := 0; i < 1000; i++ {
wg.Add(1)
go callAPI(&wg, client)
}
wg.Wait()
log.Println(time.Since(start))
}

func callAPI(wg *sync.WaitGroup, client http.Client) {
defer wg.Done()
url := `JSON-API-URL-OF-YOUR-CHOICE` // Please enter a valid json api url.
request, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatalln(err)
}

resp, err := client.Do(request)
if err != nil {
log.Fatalln(err)
}

var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
defer resp.Body.Close()

log.Println(result)
}

最佳答案

当一个线程在系统IO调用上被阻塞时,Go可能会创建一个新线程来让其他goroutines继续运行。这有一个很好的解释:https://povilasv.me/go-scheduler/ :

Interesting things happen when your goroutine makes a blocking syscall. Blocking syscall will be intercepted, if there are Gs to run, runtime will detach the thread from the P and create a new OS thread (if idle thread doesn’t exist) to service that processor.

因此,与其拥有少量线程并使用 0% 的 CPU,因为所有线程都被捆绑等待阻塞系统调用返回,而是将这些线程放在一边并启动新线程,以便非阻塞 goroutines可以在等待阻塞的系统调用返回时完成他们的工作。

关于go - 为什么 golang 中的线程使用量随着网络 IO 的增加而增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53983656/

59 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com