文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

golang中线程和协程有哪些区别

2023-06-14 06:51

关注

这篇文章主要介绍golang中线程和协程有哪些区别,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

区别:线程中数据存储在内核态的内存空间;而协程中数据存储在线程提供的用户态内存空间。线程的任务调度由内核实现,抢占方式,依赖各种锁;协程的任务调度由用户态实现的具体调度器进行。

协程
协程,英文名Coroutine。但在 Go 语言中,协程的英文名是:gorutine。它常常被用于进行多任务,即并发作业。没错,就是多线程作业的那个作业。

虽然在 Go 中,我们不用直接编写线程之类的代码来进行并发,但是 Go 的协程却依赖于线程来进行。

下面我们来看看它们的区别。

线程的基础介绍,这里请自行网上搜索文章,因为关于线程的优秀介绍文章已经很多。

协程的特点
这里先直接列出线程的特点,然后从例子中进行解析。

上面第 1第 2

我们来看一个例子:func TestGorutine(t *testing.T) {runtime.GOMAXPROCS(1)  // 指定最大 P 为 1,从而管理协程最多的线程为 1 个wg := sync.WaitGroup{} // 控制等待所有协程都执行完再退出程序wg.Add(2)// 运行一个协程go func() {fmt.Println(1)fmt.Println(2)fmt.Println(3)wg.Done()}()// 运行第二个协程go func() {fmt.Println(65)fmt.Println(66)// 设置个睡眠,让该协程执行超时而被挂起,引起超时调度time.Sleep(time.Second)fmt.Println(67)wg.Done()}()wg.Wait()}

上面的代码片段跑了两个协程,运行后,观察输出的顺序是交错的。可能是:

656612367

意味着在执行协程A的过程中,可以随时中断,去执协程行B,协程B也可能在执行过程中中断再去执行协程A。
看起来协程A 和 协程B 的运行像是线程的切换,但是请注意,这里的 A 和 B都运行在同一个线程里面。它们的调度不是线程的切换,而是纯应用态的协程调度
关于上述代码中,为什么要指定下面两行代码?

runtime.GOMAXPROCS(1)time.Sleep(time.Second)

这需要您去看下 Go 的协程调度入门基础,请看我之前的另外一篇调度分析文章:
Go 的协程调度机制

如果不设置 runtime.GOMAXPROCS(1),那么程序将会根据操作系统的 CPU 核数而启动对应数量的 P,导致多个 M,即线程的启动。那么我们程序中的协程,就会被分配到不同的线程里面去了。为了演示,故设置数量 1,使得它们都被分配到了同一个线程里面,存于线程的协程队列里面,等待被执行或调度。

协程特点中的第 3第 4点。
3. 执行效率高。
4. 占用内存少。

因为协程的调度切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。调度发生在应用态而非内核态。

内存的花销,使用其所在的线程的内存,意味着线程的内存可以供多个协程使用。

其次协程的调度不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,所以执行效率比多线程高很多。

协程和线程的整体对比

比较的点线程协程
数据存储内核态的内存空间一般是线程提供的用户态内存空间
切换操作操作最终在内核层完成,应用层需要调用内核层提供的 syscall 底层函数应用层使用代码进行简单的现场保存和恢复即可
任务调度由内核实现,抢占方式,依赖各种锁由用户态的实现的具体调度器进行。例如 go 协程的调度器
语音支持程度绝大部分编程语言部分语言:Lua,Go,Python …
实现规范按照现代操作系统规范实现无统一规范。在应用层由开发者实现,高度自定义,比如只支持单线程的线程。不同的调度策略,等等

以上是“golang中线程和协程有哪些区别”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯