0%

context 的使用,context是否并发安全(联动问题->多个协程的同时控制)?

Go 的 Context 的数据结构包含 Deadline,Done,Err,Value;它可以控制一组呈树状结构的goroutine,每个goroutine拥有相同的上下文。通过context包,可以非常方便地在请求goroutine之间传递请求数据、取消信号和超时信息。

type Context interface {
   Deadline() (deadline time.Time, ok bool)
   Done() <-chan struct{}
   Err() error
   Value(key interface{}) interface{}
}

基础的context接口只定义了4个方法,下面分别简要说明一下:

  • Deadline 方法:可以获取设置的截止时间,返回值 deadline 是截止时间,到了这个时间,Context 会自动发起取消请求,返回值 ok 表示是否设置了截止时间。
  • Done 方法:返回一个只读的 channel ,类型为 struct{}。如果这个 chan 可以读取,说明已经发出了取消信号,可以做清理操作,然后退出协程,释放资源。
  • Err 方法:返回Context 被取消的原因。
  • Value 方法:获取 Context 上绑定的值,是一个键值对,通过 key 来获取对应的值。

最常用的是 Done 方法,在 Context 取消的时候,会关闭这个只读的 Channel,相当于发出了取消信号。

阅读全文 »

slice 和 array的区别?(下级问题->slice底层与扩容机制)

  • 数组的零值是元素类型的零值,切片的零值是 nil;
  • 数组是固定长度,切片是可变长度;
  • 数组是值类型,切片是引用类型。

slice的底层实现

slice 底层 是有 3 个字段的数据结构分为:

  • array 数组
  • len 长度
  • cap 容量

指针指向数组的第一个该 slice 可访问的元素,这个元素并不一定是底层数组的第一个元素,长度是指 slice 中元素的个数,它不能超过 slice 的容量。

容量的大小通常是从 slice 底层数组的元素个数,什么意思呢举例:

arr:=[]int{1,2,3,4} slice:=arr[1:3] —(即:{2,3,4}) slice的长度为3 容量为4({1,2,3,4}为底层数组)

Go 的内置函数 len 和 cap 用来返回 slice 的长度和容量。

阅读全文 »

(上级垃圾回收 问题逻辑- 垃圾回收->逃逸分析->内存逃逸)

逃逸分析是什么:编译器决定内存分配位置的方式,就称之为逃逸分析(escape analysis)。逃逸分析由编译器完成,作用于编译阶段。

逃逸分析能做什么:可以了解程序哪些内存在栈上,哪些在堆上,从而优化减少垃圾回收提升性能。

如何进行逃逸分析:go语言可以使用go build -gcflags ‘-m -N -l’ test.go 的方式 查看编译结果中的逃逸情况 在堆上(heap)的就发生了逃逸

必然不会发生逃逸的情况:

  1. 指针被没有发生逃逸的变量引用

  2. 仅仅在函数被对变量进行取地址操作,没有将指针传出

阅读全文 »

(上级问题并发 问题逻辑- 并发机制->GMP->goroutine调度)

goroutine(协程)和线程

说线程之前,我们先说进程和线程的关系,

首先线程是进程的执行体,拥有一个执行入口,以及进程虚拟地址空间中分配的栈—包括用户栈和内核栈,操作系统会记录线程控制信息,

而线程会在获得cpu时间片信息后执行 ,cpu中栈指针、指令指针等寄存器都到切换到对应的线程;

而协程就是线程创建的执行体,其控制信息由线程记录,由于用户程序不能操作内核空间,所以只能给协程分配用户栈,而操作系统对这个信息一无所知。

总结:协程是一种”用户态线程”。

goroutine如何调度

说到goroutine的调度就不得不提MPG(GMP)模型

  • M: 线程
  • P: 执行go协程运行所必需的资源,关联本地可运行G的队列
  • G: go协程
阅读全文 »

go语言并发原理

Go不推荐用共享内存的方式传递数据,而推荐使用channel(或称“通道” )。channel主要用来在多个goroutine之间传递数据,并且还

会保证整个过程的并发安全性。不过,作为可选方法,Go依然提供了一些传统的同步方法 (比如互斥量、 条件变量等)。

Go的并发机制指的是用于支撑goroutine 和channel的底层原理,说到这个就不得不提go语言的调度模型,GMP。

GMP调度模型

说起Go的线程实现模型,有3个必知的核心元素,它们支撑起了这个模型的主框架,
简要说明如下:

  • M: machine的缩写。一个M代表一个内核线程,或称“工作线程”。
  • P: processor的缩写。一个P代表执行一个Go代码片段所必需的资源(或称“上下文环境”)。
  • G: goroutine的缩写。一个G代表一 个Go代码片段。前者是对后者的一种封装。

.未完待续~~~