文字解说Golang Goroutine和线程的区别
作者:头秃猫轻王 时间:2023-10-15 18:56:36
Golang Goroutine和线程的区别 Golang,轻松学习
一、Golang Goroutine?
当使用者分配足够多的任务,系统能自动帮助使用者把任务分配到 CPU 上,让这些任务尽量并发运作。这种机制在 Go语言中被称为 goroutine。
goroutine 是 Go语言中的轻量级线程实现,由 Go 运行时(runtime)管理。Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。
使用每一个 go 关键字将会额外开启一个新的协程 goroutine
二、线程是什么?
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
三、调度的区别
1.线程调度
线程是系统调度的基本单位,线程作为调度与分配的基本单位,线程切换,仅需保存和设置少量寄存器的内容,开销远小于进程开销。但这种线程切换仍然需要一个完整的上下文切换:即保存一个线程的状态到内存,再恢复另外一个线程的状态,最后更新调度器的数据结构。某种意义上,这种操作还是很慢的。
2.goroutine 调度
Go运行的时候包涵一个自己的调度器,这个调度器使用一个称为一个M:N调度技术,m个goroutine到n个os线程(可以用GOMAXPROCS来控制n的数量),Go的调度器不是由硬件时钟来定期触发的,而是由特定的go语言结构来触发的,他不需要切换到内核语境,所以调度一个goroutine比调度一个线程的成本低很多。
Goroutine协程是一种协作任务控制机制,Goroutine可以理解为一种Go语言的协程。同时它可以运行在一个或多个线程上。而Goroutine协程的切换一般由程序员在代码中显式控制。它避免了上下文切换的额外耗费,兼顾了多线程的优点,简化了高并发程序的复杂。
四、栈空间的区别
1.线程占用
每个OS的线程都有一个固定大小的栈内存,通常是2MB,栈内存用于保存在其他函数调用期间哪些正在执行或者临时暂停的函数的局部变量。这个固定的栈大小,如果对于goroutine来说,可能是一种巨大的浪费。
以 64位环境的 JVM 为例,会默认固定为每个线程分配 1MB 栈空间,如果大小分配不当,便会出现栈溢出的问题。
2.goroutine 占用
- goroutine 所占用的内存,均在栈中进行管理 - goroutine 所占用的栈空间大小,由 runtime 按需进行分配 goroutine在生命周期开始只有一个很小的栈,典型情况是2KB, 在go程序中,一次创建十万左右的goroutine也不罕见(2KB*100,000=200MB)。而且goroutine的栈不是固定大小,它可以按需增大和缩小,最大限制可以到1GB。 goroutine 相较于线程更加轻量,关键点就在于栈空间的动态分配,这样便可以最大限度的利用内存资源。
五、标识的区别
1.线程标识
在大部分支持多线程的操作系统和编程语言中,线程有一个独特的标识,通常是一个整数或者指针,这个特性可以让我们构建一个线程的局部存储,本质是一个全局的map,以线程的标识作为键,这样每个线程可以独立使用这个map存储和获取值,不受其他线程干扰。
2.goroutine 标识
goroutine中没有可供程序员访问的标识,原因是一种纯函数的理念,不希望滥用线程局部存储导致一个不健康的超距作用,即函数的行为不仅取决于它的参数,还取决于运行它的线程标识。
来源:https://blog.csdn.net/moer0/article/details/123672726
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Goland 关闭自动移除未使用的包操作
![](https://img.aspxhome.com/file/2023/3/123983_0s.jpg)
Python字符串的全排列算法实例详解
配置SQL Server数据库恢复模式(2种方法)
![](https://img.aspxhome.com/file/2023/5/104125_0s.jpg)
一篇文章弄懂Python中所有数组数据类型
python 动态导入模块实现模块热更新的方法
![](https://img.aspxhome.com/file/2023/1/111991_0s.jpg)
swiper Scrollbar滚动条组件详解
![](https://img.aspxhome.com/file/2023/2/135922_0s.jpg)
浅谈python print(xx, flush = True) 全网最清晰的解释
![](https://img.aspxhome.com/file/2023/7/76737_0s.jpg)
go语言获取系统盘符的方法
javascript读取xml
Python Matplotlib库入门指南
CSS网页布局扩展小技巧
python运行cmd命令行的3种方法总结
使用python-pptx操作PPT的示例详解
![](https://img.aspxhome.com/file/2023/0/104840_0s.png)
Pycharm远程连接服务器并实现代码同步上传更新功能
![](https://img.aspxhome.com/file/2023/7/76117_0s.jpg)
SqlServer表死锁的解决方法分享
教你利用python的matplotlib(pyplot)绘制折线图和柱状图
![](https://img.aspxhome.com/file/2023/6/93626_0s.png)
Dreamweaver制作技巧四则
在SQL Server 2005数据库中更改数据架构
利用MySQL加密函数保护Web网站敏感数据
使用Python中OpenCV和深度学习进行全面嵌套边缘检测
![](https://img.aspxhome.com/file/2023/0/67420_0s.jpg)