首页 > 其他分享 >[Golang基础]Goroutine

[Golang基础]Goroutine

时间:2024-06-23 14:42:22浏览次数:3  
标签:协程 Goroutine 基础 调度 Golang 线程 切换 go 内核

协程(CoRoutine)是一种轻量级的用户态线程。简单来说,线程(thread)的调度是由操作系统负责,线程的睡眠、等待、唤醒的时机是由操作系统控制,开发者无法决定。使用协程,开发者可以自行控制程序切换的时机,可以在一个函数执行到一半的时候中断执行,让出CPU,在需要的时候再回到中断点继续执行。因为切换的时机是由开发者来决定的,就可以结合业务的需求来实现一些高级的特性。

协程的特点:

有独立的栈空间
共享程序堆空间
调度由用户控制
协程是轻量级的线程

协程的优点:

代码编辑简单。可以将异步处理逻辑代码用同步的方式编写,将多个异步操作集中到一个函数中完成。
单线程模式,没有线程安全的问题,不需要加锁操作。
性能好。协程是用户态线程,切换更加高效。

为什么协程比线程轻量?
一旦创建完线程,你就无法决定他什么时候获得时间片,什么时候让出时间片了,你把它交给了内核。而协程编写者可以有:可控的切换时机和很小的切换代价。从操作系统有没有调度权上看,协程就是因为不需要进行内核态的切换。

go协程调用跟切换比线程效率高
线程并发执行流程:

线程是内核对外提供的服务,应用程序可以通过系统调用让内核启动线程,由内核来负责线程调度和切换。线程在等待IO操作时线程变为unrunnable状态会触发上下文切换。现代操作系统一般都采用抢占式调度,上下文切换一般发生在时钟中断和系统调用返回前,调度器计算当前线程的时间片,如果需要切换就从运行队列中选出一个目标线程,保存当前线程的环境,并且恢复目标线程的运行环境,最典型的就是切换ESP指向目标线程内核堆栈,将EIP指向目标线程上次被调度出时的指令地址。

go协程并发执行流程:

不依赖操作系统和其提供的线程,golang自己实现的CSP并发模型实现:M, P, G。

go协程也叫用户态线程,协程之间的切换发生在用户态。在用户态没有时钟中断,系统调用等机制,因此效率高。

go协程占用内存少
执行go协程只需要极少的栈内存(最新版默认2KB,可以根据程序执行自动伸缩),默认情况下,线程栈的大小为1MB。

goroutine就是一段代码,一个函数入口,以及在堆上为其分配的一个堆栈。所以它非常廉价,我们可以很轻松的创建上万个goroutine,但它们并不是被操作系统所调度执行。

为什么goroutine更快

标签:协程,Goroutine,基础,调度,Golang,线程,切换,go,内核
From: https://www.cnblogs.com/DCFV/p/18263443

相关文章

  • 基于协同过滤算法的智能推荐系统基础介绍
    协同过滤算法概述协同过滤算法的核心思想是通过用户或物品的相似性进行推荐。该算法主要分为两类:基于用户的协同过滤(User-basedCollaborativeFiltering):寻找相似的用户群体,推荐他们喜欢的产品给目标用户。基于物品的协同过滤(Item-basedCollaborativeFiltering):根据用户的历......
  • Scala基础与集合操作
    Scala简介Scala,一种将面向对象编程和函数式编程融为一体的高级语言,正受到越来越多开发者的青睐。它以其简洁、优雅的语法和类型安全的保证,成为了构建大型系统和编写简单脚本的理想选择。Scala运行于Java平台,能够与Java库无缝集成。由于其在Spark等大数据处理框架中的重要应用,学......
  • HBase:从基础操作到集群管理
    HBase简介HBase,一个由Apache软件基金会开发的分布式、面向列的NoSQL数据库,以其高性能和可扩展性在大数据领域占据着重要地位。HBase的基本概念HBase是基于Google的Bigtable模型构建的,它是一个分布式、可扩展、面向列的存储系统,适合于存储大量的非结构化和半结构化的稀疏数据集......
  • Apache Spark 安装和基础使用
    Spark概述ApacheSpark是一个开源的集群计算框架,以其快速、易用、通用和高度可扩展性而著称。Spark支持多种编程语言,包括Java、Scala、Python和R,并提供了丰富的库,如SparkSQL、MLlib、GraphX和SparkStreaming。Spark的主要特点快速:Spark通过在内存中存储中间数据,......
  • AcWing算法基础课笔记——求组合数3
    求组合数Ⅲ20万组数据,1≤b≤a≤1......
  • JavaScript基础部分知识点总结(Part6)
    BOM概述1.什么是BOMBOM(BrowserObjectModel)即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是window。BOM由一系列相关的对象构成,并且每个对象都提供了很多方法与属性。BOM缺乏标准,JavaScript语法的标准化组织是ECMA,DOM的标准化组织是W3C,BOM最......
  • RocketMQ 基础教程-系统架构
    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!阶段1、深入多线程阶段2、深入多线程设计模式阶段3、深入juc源码解析阶段4、深入jdk其余源码解析......
  • 应用数学与机器学习基础 - 最大似然估计篇
    序言最大拟然估计(MaximumLikelihoodEstimation,MLE)是统计学和机器学习领域中的一种重要参数估计方法。MLE的核心思想是基于给定的数据,找到一组参数值,使得这组参数生成观测数据的概率(即似然函数)达到最大。这样做的原因在于,如果某组参数能够使得观测数据出现的概率最大,那......
  • python测试工程师 之 python基础大全【13万字总结】
    python基础大全【13万字】Day011、Python概述2、Python解释器和pycharmIDE工具3、Python中的注释4、变量5、标识符的命名规范★6、变量的使用7、Python中的数据类型★8、Python中的bug和调试9、字符串的格式化及输出★10、转译字符day021、转译字符2、f-string★3、......
  • [Golang并发]Sync.Mutex
    源码//Copyright2009TheGoAuthors.Allrightsreserved.//UseofthissourcecodeisgovernedbyaBSD-style//licensethatcanbefoundintheLICENSEfile.//Packagesyncprovidesbasicsynchronizationprimitivessuchasmutual//exclusionlocks.......