这是我参与「第五届青训营 」伴学笔记创作活动的第 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{})