go并发 | 青训营笔记

47 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

一.对并发和并行的理解?

(1)并行

(同一时刻,不同实体) 两个或两个以上事件或活动在同一时刻发生 (如果多个任务在多个CPU或CPU的多个核上同时执行,不存在CPU资源的竞争、等待行为)

(2)并发 (同一时间间隔,同一实体)

二.进程和线程的基本概念

进程

系统进行资源分配和调度的一个独立单位 系统并发执行的单位

线程

进程的实体CPU调度和分配的基本单位

三.协程/线程

协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。

线程:一个线程上可以跑多个协程,协程是轻量级的线程。

go相关

Go语言的并发机制运用起来非常简便,在启动并发的方式上直接添加了语言级的关键字就可以实现,和其他编程语言相比更加轻量。

Go中使用两种手段来实现,Goroutines和Channels

Goroutines:在Go语言中,每一个并发的执行单元叫作一个goroutine。 Go 语言层面支持的 go 关键字,可以快速的让一个函数创建为 goroutine,我们可以认为 main 函数就是作为 goroutine 执行的。操作系统调度线程在可用处理器上运行。

//go 关键字放在方法调用前新建一个 goroutine 并执行方法体
go GetThingDone(param1, param2);
//新建一个匿名方法并执行
go func(param1, param2) {
}(val1, val2)
//直接新建一个 goroutine 并在 goroutine 中执行代码块
go {
    //do someting...
}

Channels:Channels是Goroutines之间的通信机制。channels 是一种类型安全的消息队列,充当两个 goroutine 之间的管道,将通过它同步的进行任意资源的交换。chan 控制 goroutines 交互的能力从而创建了 Go 同步机制。

ci := make(chan int)
cs := make(chan string)
cf := make(chan interface{})