当前位置: 首页 > news >正文

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 mainimport ("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

相关文章:

  • SpringCloud微服务框架的原理及应用详解(一)
  • 常见的宽基指数基金
  • PHP混淆加密以及常用的一些加密工具
  • 内核学习——1、list_head
  • 深度解析响应式异步编程模型
  • 巧用newSingleThreadExecutor让异步任务顺序跑
  • 构建一个强大的小型虚拟负载
  • 记录SpringBoot启动报错解决
  • Spring IoC【控制反转】DI【依赖注入】
  • 爬虫逆向实战(41)-某花顺登陆(Cookie、MD5、SHA256)
  • 关于scrapy模块中间件的简单理解
  • 案例分享:高科技企业产品管理部门设置和产品经理岗位设置
  • MySQL 面试突击指南:核心知识点解析1
  • YOLOv10改进 | 注意力篇 | YOLOv10引入YOLO-Face提出的SEAM注意力机制优化物体遮挡检测
  • 改进YOLOv7 | 在 ELAN 模块中添加【Triplet】【SpatialGroupEnhance】【NAM】【S2】注意力机制 | 附详细结构图
  • 【Leetcode】101. 对称二叉树
  • $translatePartialLoader加载失败及解决方式
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【Linux系统编程】快速查找errno错误码信息
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • emacs初体验
  • JavaScript实现分页效果
  • JS数组方法汇总
  • Phpstorm怎样批量删除空行?
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 缓存与缓冲
  • 看域名解析域名安全对SEO的影响
  • 蓝海存储开关机注意事项总结
  • 区块链技术特点之去中心化特性
  • 译自由幺半群
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​configparser --- 配置文件解析器​
  • ​插件化DPI在商用WIFI中的价值
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • #单片机(TB6600驱动42步进电机)
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (a /b)*c的值
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (十三)Flink SQL
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • ... 是什么 ?... 有什么用处?
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .equals()到底是什么意思?
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [2016.7.Test1] T1 三进制异或