登录
首页 >  Golang >  Go问答

聊聊go语言中网络IO增加线程使用率的原因

来源:Golang技术栈

时间:2023-03-09 11:12:07 245浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《聊聊go语言中网络IO增加线程使用率的原因》,以下内容将会涉及到golang,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

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

当我尝试监视使用的线程数时,它上升到 400 个线程。我曾经使用top命令监控,我的理解是对于网络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 <h2 class="daan">正确答案</h2><p>当一个线程在系统 IO 调用上被阻塞时,Go 可能会创建一个新线程以允许其他 goroutine
继续运行。这有一个很好的解释:<a target='_blank'  href='https://www.17golang.com/gourl/?redirect=MDAwMDAwMDAwML57hpSHp6VpkrqbYLx2eayza4KafaOkbLS3zqSBrJvPsa5_0Ia6sWuR4Juaq6t9nq5roGCUgXuytMyerpd5cJfFi6nMm5a9rpq9haa8ZGioyGuGn4qQi2nHqryxgKuEz62tfs6Sqrlph6pxYLyGm2S_fYGofmuDorLN0WyDhp_Rsa6VzoXdsqWGvX1iu6ybcQ' rel='nofollow'>https</a> ://povilasv.me/go-
scheduler/ :</p><blockquote><p>当你的 goroutine 进行阻塞系统调用时会发生有趣的事情。阻塞的 syscall 将被拦截,如果有 Gs 要运行,运行时将从 P
中分离线程并创建一个新的 OS 线程(如果空闲线程不存在)来服务该处理器。</p></blockquote><p>因此,与其拥有少量线程并利用 0% 的 CPU,因为所有线程都被捆绑等待阻塞系统调用返回,而是将这些线程放在一边并启动新线程,以便非阻塞 goroutine
可以执行它们的任务在等待阻塞系统调用返回时工作。</p><p>终于介绍完啦!小伙伴们,这篇关于《聊聊go语言中网络IO增加线程使用率的原因》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!</p>
声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>