码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Goroutine和协程的区别


    线程

    1. 定义:线程是操作系统管理的基本执行单元,一个进程可以包含多个线程。
    2. 重量级:线程是重量级的操作系统资源,创建和销毁线程的开销较大。
    3. 内存消耗:每个线程有独立的栈空间(通常为几MB),因此大量线程会消耗大量内存。
    4. 切换开销:线程之间的上下文切换由操作系统内核完成,开销较大。
    5. 并行性:线程可以利用多核CPU并行执行。

    Goroutine

    1. 定义:Goroutine是Go语言中的轻量级线程,由Go运行时管理。
    2. 轻量级:Goroutine的创建和销毁开销非常小,可以轻松创建成千上万个Goroutine。
    3. 内存消耗:Goroutine的初始栈空间非常小(约2KB),并且可以动态增长。
    4. 切换开销:Goroutine之间的上下文切换由Go运行时管理,开销较小。
    5. 并行性:Goroutine同样可以利用多核CPU并行执行,但其调度由Go运行时完成,不依赖操作系统线程。

    区别

    1. 管理方式:线程是操作系统级别的,由操作系统来管理;而Goroutine则是由Go的运行时系统进行管理,这就是的Goroutine的创建、运行和销毁更加高效和简洁。
    2. 资源占用:Goroutine比线程更加轻量级。一个Goroutine的堆栈大小在初始化的时候只有几KB,而线程的堆栈大小通常是几MB。同时,Go语言在运行的时候可以动态地增减Goroutine的堆栈大小。
    3. 切换成本:线程的切换需要设计用户态和内核态之间的切换,成本高;而Goroutine之间的切换只发生在用户态,成本低。
    4. 调度方式:线程是被操作系统抢占式调度的,而Goroutine是由Go语言运行时进行协作式调度。这意味着Goroutine需要显式地进行切换,通常通过channel的发送/接收或者调用runtime.Gosched()完成。

    我们可以尝试创建百万个Goroutine:

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func say(s string) {
    	for i := 0; i < 5; i++ {
    		time.Sleep(10 * time.Millisecond)
    		fmt.Println(s)
    	}
    }
    
    func main() {
    	for i := 0; i < 1e6; i++ {
    		go say("goroutine")
    	}
    	say("main")
    }
    

    最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB

  • 相关阅读:
    如何做架构设计?
    一文搞懂RepVGG网络
    【计算机视觉】上采样和下采样
    人工智能发展与结构科学
    熬秃了头整理的网工学习笔记和心得,赠与有缘人
    温度和pH双重响应荧光功能聚合物纳米/聚合物超细纤维AIE微球/AIE有机荧光分子的探讨
    关于#rust#的问题:用rust的格式化输出println,指定带中文的字符串的位宽,无效(相关搜索:中英文字符串)
    如何看待黑客入侵我们的电脑?会有哪些影响?如何感知及应对?
    D. The Enchanted Forest
    黑马瑞吉外卖之员工账号的禁用和启用以及编辑修改
  • 原文地址:https://blog.csdn.net/Faya__/article/details/139840432
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号