GO语言基础介绍

news2024/11/24 19:36:28

go语言的GMP模型(协程并发模型),P是go语言本身内部实现的调度器,它是基于协程队列的,协程在调度器面前就类似一个个独立的任务;P一般数量上是处理器内核数。Process本身有调度和创建M的能力,它会调用系统内核方法创建M(M就是内核中轻量级进程),当其中一个M堵塞甚至发生异常了,那么P会调用系统方法创建新的子进程处理,在子进程中是循环获取goroution,也就是对于每一个M进程而言,其执行的伪代码指令:

while(routinelist.size() > 0){
   if(next.task){
      run routinelist[i].task
   }
}

Context通常被称为上下文,在go中,理解为goroutine的运行状态、现场;存在上下层goroutine context的传递,上层goroutine会把context传递给下层goroutine。在网络编程中,当接收到一个网络请求的request,处理request时,可能会在多个goroutine中处理。而这些goroutine可能需要共享Request的一些信息;当request被取消或者超时时,所有从这个request创建的goroutine也要被结束。

1. Context是我们自己来创建和维护的

2. Context创建一般都需要指向传递父节点的上下文对象,所以Context是一个树状结构

go context包不仅实现了在程序单元之间共享状态变量的方法,同时能通过简单的方法,在被调用程序单元外部通过设置ctx变量的值,将过期或撤销等信号传递给被调用的程序单元。在网络编程中,如果存在A调用B的API,B调用C的 API,如果A调用B取消,那么B调用C也应该被取消,通过在A、B、C调用之间传递context,以及判断其状态就能解决此问题。context结构:

// A Context carries a deadline, a cancellation signal, and other values across
// API boundaries.
// Context's methods may be called by multiple goroutines simultaneously.
type Context interface {
    // Deadline returns the time when work done on behalf of this context
    // should be canceled. Deadline returns ok==false when no deadline is
    // set. Successive calls to Deadline return the same results.<br>      
    // 返回一个超时时间,到期则取消context。在代码中,可以通过 deadline 为io操作设置超时时间
    Deadline() (deadline time.Time, ok bool)
    
    // a Done channel for cancellation. 返回一个channel, 用于接收context的取消或者deadline 
    //信号。当channel关闭,监听done信号的函数会立即放弃当前正在执行的操作并返回。如果 context实 
    //例是不可取消的,那么返回 nil, 比如空 context, valueCtx
    Done() <-chan struct{}
 
    // 返回一个error变量,从其中可以知道为什么context会被取消。
    Err() error
 
    // 让context在goroutine之间共享数据,当然,这些数据需要时协程并发安全的。比如,共享了一个 
    //map,那么这个map的读写要加锁。
    Value(key interface{}) interface{}
}

Channel 被设计用来实现协程间通信的组件,其作用域和生命周期不可能仅限于某个函数内部,所以 golang 直接将其分配在堆上,准确地说,你并不需要知道。Golang 中的变量只要被引用就一直会存活,存储在堆上还是栈上由内部实现决定而和具体的语法没有关系。知道变量的存储位置确实和效率编程有关系。如果可能,Golang 编译器会将函数的局部变量分配到函数栈帧(stack frame)上。然而,如果编译器不能确保变量在函数 return (pop压出栈)之后不再被引用,编译器就会将变量分配到堆上。而且,如果一个局部变量非常大,那么它也应该被分配到堆上而不是栈上。当前情况下,如果一个变量被取地址,那么它就有可能被分配到堆上;然而还要对这些变量做逃逸分析,如果函数 return 之后,变量不再被引用,则将其分配到栈上。GO并发通信的模型是通信顺序进程(Communicating Sequential Processes, CSP),借助于内部实现的Channel机制,channel是golang中用来实现多个goroutine通信的管道,它的底层是一个叫做hchan的结构体。在go的runtime包下。

type hchan struct {
   //channel分为无缓冲和有缓冲两种。
   //对于有缓冲的channel存储数据,借助的是如下循环数组的结构
     qcount   uint           // 循环数组中的元素数量
     dataqsiz uint           // 循环数组的长度
     buf      unsafe.Pointer // 指向底层循环数组的指针
     elemsize uint16 //能够收发元素的大小
   ​
     closed   uint32   //channel是否关闭的标志
     elemtype *_type //channel中的元素类型
   
   //有缓冲channel内的缓冲数组会被作为一个“环型”来使用。
   //当下标超过数组容量后会回到第一个位置,所以需要有两个字段记录当前读和写的下标位置
     sendx    uint   // 下一次发送数据的下标位置
     recvx    uint   // 下一次读取数据的下标位置
   
   //当循环数组中没有数据时,收到了接收请求,那么接收数据的变量地址将会写入读等待队列
   //当循环数组中数据已满时,收到了发送请求,那么发送数据的变量地址将写入写等待队列
     recvq    waitq  // 读等待队列
     sendq    waitq  // 写等待队列
 ​​
     lock mutex //互斥锁,保证读写channel时不存在并发竞争问题
 }

结构图如下: 

 总结hchan结构体的主要组成部分有四个:

  • 用来保存goroutine之间传递数据的循环链表。=> buf。
  • 用来记录此循环链表当前发送或接收数据的下标值。=> sendx和recvx。
  • 用于保存向该chan发送和从改chan接收数据的goroutine的队列。=> sendq 和 recvq
  • 保证channel写入和读取数据时线程安全的锁。 => lock

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/84436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web3中文|迪士尼前任CEO回归,能否带领迪士尼开辟web3之路?

据国外媒体报道&#xff0c;11 月 21 日&#xff0c;当地时间周日晚间&#xff0c;迪士尼宣布首席执行官&#xff08;CEO&#xff09;鲍勃 查佩克&#xff08;Bob Chapek&#xff09;离职&#xff0c;而其前任鲍勃 伊格尔&#xff08;Bob Iger&#xff09;将重返迪士尼CEO一职…

Navicat 16 和表空间 - Part 2

如何运作 "What is it? Its it" - Epic, Faith No More 欢迎回到这个关于在 Navicat 16 中使用表空间的系列。第 1 部分介绍了表空间的一些优点&#xff0c;包括可恢复性、轻易添加更多表、自动存储管理以及在隔离缓冲池中数据以提高性能或内存利用率。而第二部分…

Spring boot 3 GraalVM Native Image

Spring boot 3 && GraalVM Native Image 什么是 GraalVM? GraalVM is a high-performance JDK designed to accelerate the execution of applications written in Java and other JVM languages while also providing runtimes for JavaScript, Python, and a numb…

Seata模式-tcc

Seata模式目录概述需求&#xff1a;设计思路实现思路分析1.tcc模式2.一阶段 prepare 行为参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,c…

qiankun 部署微前端-vue2 (二)

对于基本的部署问题&#xff0c;也可以去官网查找答案&#xff1a; 常见问题 - qiankun 这里主要记录在部署过程中遇到的问题 一、路由权限问题 无论主应用路由还是子应用中的路由&#xff0c;都会涉及权限问题&#xff0c;并不是每个路由路径对任何角色都是可见&#xff0…

Linux学习-83-MySQL安装过程

17.12 MySQL安装 作为LAMP架构的后端&#xff0c;是一款流行的开源关系数据库系统。在企业网站、业务系统等应用中&#xff0c;各种账户信息、产品信息&#xff0c;客户资料、业务数据等都可以存储到MySQL数据库&#xff0c;其他程序可以通过SQL语句来查询&#xff0c;更改这些…

〖产品思维训练白宝书 - 产品思维认知篇①〗- 产品思维能够为我们带来多大的价值?

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

算法竞赛入门【码蹄集进阶塔335题】(MT2026-2050)

算法竞赛入门【码蹄集进阶塔335题】(MT2026-2050&#xff09; 文章目录算法竞赛入门【码蹄集进阶塔335题】(MT2026-2050&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f;目录1. MT2026 二维坐标点移动2. MT2027 一秒成零3. MT2028 小…

开关量转4G模块直接阿里云操作介绍

开关量转4G模块直接阿里云操作介绍首先&#xff0c;设备接入阿里云阿里云的连接 同上&#xff0c;配置阿里云平台参数前&#xff0c;和华为云一样&#xff0c;首先要在阿里云控制台创建产品&#xff0c;添加设备获取设备证书 上云流程&#xff1a;创建产品--添加设备--获取证书…

USACO简介

USACO是美国信息学奥赛官网&#xff0c;网站为&#xff1a;USACO 其中还包括USACO TRAINING题目&#xff0c;这是一个可以做练习的网站&#xff0c;网站为USACO Training Gateway 进入USACO网站&#xff0c;我们可以看到以下图片 下来简要说一下关于USACO的注意事项 1.USACO…

python-(6-5-3)爬虫---处理防盗链获取视频

文章目录一 需求二 分析1 拿到contId2 拿到video_status返回的json -----> src Url3 对src Url 进行修整4 下载资源三 代码一 需求 想要获得某处的视频资源&#xff0c;但由于防盗链的存在&#xff0c;使得在使用浏览器的开发页面获得的视频地址与我们实际获取的地址产生差…

Spring源码深度解析十四:@Aspect方式的AOP上篇 - @EnableAspectJAutoProxy

一、前言 文章目录&#xff1a;Spring源码深度解析&#xff1a;文章目录 二、简介 Aop 即面向切面编程&#xff0c;而 Aspect 是Aop 思想的一种实现。 并不是所有的AOP框架都相同&#xff0c;它们在连接点模型上可能有强弱之分&#xff0c;有些允许在字段修饰符级别的应用通…

分享a股下单接口执行买入操作的流程代码

用户在使用a股下单接口&#xff0c;能够得到更多更准确的信息&#xff0c;让用户在股市当中&#xff0c;操作起来更加便捷和有效&#xff0c;对股市市场行情动向判断更加的准确一些。 下面看一下a股下单接口是如何执行买入操作的功能&#xff1a; std::cout << " …

小程序批发订货怎么做

小程序订货系统 批发订货是每个生产企业都不少不了的一个环节&#xff0c;伴随着信息化技术的不断更新&#xff0c;传统的订货方式已经不能满足生产企业的需求了&#xff0c;而鲜桥小程序订货系统基于微信生态&#xff0c;让你即买即用&#xff0c;轻松告别传统的订货方式&…

Java解析NC2018-2020降水量格点数据

经纬度范围 lon = 7849;lat = 5146;time = 12;double lon(lon=7849); :long_name = "longitude"; :unit = "degree"; double lat(lat=5146); :long_name = "latitude"; :unit = "degree"; double time(time=12); :long_nam…

【论文】Holistically-Nested Edge Detection

文章目录Development of Edge DetectionMulti-scale learning structureLoss FunctionNetwork Architecture&#x1f4c4;&#xff1a;Holistically-Nested Edge Detection&#x1f517;&#xff1a;https://openaccess.thecvf.com/content_iccv_2015/html/Xie_Holistically-Ne…

DSP篇--C6701功能调试系列之SRAM、ADC、喂狗测试

目录 1、SRAM测试 1.1 SRAM读写功能测试 1.2 EDAC测试 2、ADC测试 3、DSP喂狗测试 调试的前期准备可以参考前面的博文&#xff1a;DSP篇--C6701功能调试系列之前期准备_nanke_yh的博客-CSDN博客https://blog.csdn.net/nanke_yh/article/details/128277631 1、SRAM测试 1…

国税局验证码识别 识别不了我还不能input吗

前言 最近接到一个需求&#xff0c;就是在国税局的网页中输入 【发票代码】、【*发票号码】、【*开票日期】、【*开具金额(不含税)】、【*验证码】 然后将此发票进行下载&#xff0c;但是【验证码】真的是拦路虎啊&#xff0c;我也查询了好多大佬的论文&#xff0c;有的是通过J…

OTP语音芯片ic的工作原理,以及目前的现状和技术发展路线是什么?flash型

目录 otp工艺和flash工艺的区别和概念 衡量一个芯片的成本&#xff0c;简单可以归结为3个方面 芯片的生产工艺&#xff0c;比如OTP的工艺都是100nm左右的工艺、8寸晶圆&#xff0c;很便宜。并且OTP的技术需要光刻机光照的次数少&#xff0c;所以生产起来快&#xff0c;这样无…

openCV实战项目--人脸考勤

人脸任务在计算机视觉领域中十分重要&#xff0c;本项目主要使用了两类技术&#xff1a;人脸检测人脸识别。 代码分为两部分内容&#xff1a;人脸注册 和 人脸识别 人脸注册&#xff1a;将人脸特征存储进数据库&#xff0c;这里用feature.csv代替人脸识别&#xff1a;将人脸特…