登录
首页 >  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 

正确答案

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

当你的 goroutine 进行阻塞系统调用时会发生有趣的事情。阻塞的 syscall 将被拦截,如果有 Gs 要运行,运行时将从 P 中分离线程并创建一个新的 OS 线程(如果空闲线程不存在)来服务该处理器。

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

终于介绍完啦!小伙伴们,这篇关于《聊聊go语言中网络IO增加线程使用率的原因》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>