当前位置: 代码迷 >> 综合 >> go笔记
  详细解决方案

go笔记

热度:37   发布时间:2024-02-08 23:35:49.0

1)go能做什么:
1.区块链研发工程师
2.Go服务器端/游戏软件工程师
3.Golang分布式/云计算软件工程师

2)协程的引入:
goroutine求N内的素数

3)并发:
1.多个任务作用在一个cpu
2.从微观的角度看,在一个时间点上,其实只有一个任务在执行

4)并行:
1.多个任务作用于多个cpu
2.从微观的角度看,在一个时间点上,其实有多个任务在执行
3.所以理论上说:并行比并发快

5)进程:
线程(依然重量级)
协程

6)go的主线程:
可以理解为线程/可以理解为进程: 一个go线程上可以起多个协程(其实就是任务)。

7)go协程特点:
有独立的栈空间
共享程序的堆空间
调度由用户控制(什么时候开启)
协程是轻量级的线程

8)开启一个协程:
各做各的事情

9)主线程退出了,即时协程没有执行完,也会退出:
比喻:学校没了,学生也肯定没地方去了

10)goroutine入门小结:
1.主线程是一个物理线程,直接作用于cpu上的,是重量级的,非常耗费CPU资源
2.协程是从主线程开启的,是轻量级的线程,是逻辑态。对资源消耗相对小。
3.go的协程机制是重要的特点,可以轻松开启上W个协程,其他语言的并发机制
一般是基于线程的,开启过多的线程,资源消耗大,这里就凸显go在并发上
的优势了。

11)MPG动态的模式:
1.M:操作系统的主线程(是物理线程)
2.P:协程执行需要的上下文
当前os的状态,当前协程需要的上下文环境,协会才能起来时,有没有内存、cpu能分配等的记录
协程可以组成一个队列
3.G:协程


如果阻塞了,那就切换为队列中的另外一个排队的协程。

12)管道:
问题引入: 计算1~200的各个数的阶乘,并放到map中(并发安全引起的资源竞争: 引入goroutine间如何通信)

并发map写

go build --race 3.go

13)形象理解锁
班长先进去,锁上门
张三来了,发现被锁了,就等到锁队列上,
李四也来了,一看被锁了,很礼貌,排队到张三后面,
...

班长解决完毕,排在锁队列头部的张三就进来了,锁上门...

    这样通过全局锁的机制,防止多个人同时进坑


14)主线程是不知道,底层可能还会出现资源竞争。

15)资源竞争的解决
1.全局变量 + 锁
2.管道

16)新的通信机制 channel 的出现(全局变量+锁的 缺点):
1.主线程在等待所有goroutine全部完成的时间很难确定,10s仅仅是估算 
2.等待时间长了,会加长等待时间,如果等待时间短了,可能还有goroutine出于工作状态,
这时也会随着主线程的退出而销毁
3.通过全局变量+锁同步来实现通讯,也不能利用多个协程对全局变量的读写操作。

17)channel的介绍(链表、数组、切片)
1.channel本质就是一个数据结构--队列
2.数据是先进先出(FIFO)
3.线程安全,多goroutine访问时,不需要加锁,也就是说channel本身就是线程安全的(如多个协程同时读取,没问题)
4.channel是有类型的,一个string的channel只能存放string类型数据

18)核心:channel是线程安全的,多个协程操作同一个管道时,不会发生资源竞争问题。

19)
1.channel是引用类型: 所以通过函数传递过去时,操作的是同一个管道
2.channel必须初始化才能写入数据,即make后才能使用
3.管道是有类型的,intChan只能写入整数int

275    
7:30    

  相关解决方案