这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记。
并发与并行? 并发:多线程程序在一个核的CPU上运行。 并行:多线程程序在多个核的CPU上运行。
进程与协程? 进程:是程序在操作系统中的一次执行过程,系统进行资源分配以及调度的一个独立单位。 线程:是进程的一个执行实体,是CPU调度和分配的基本单位,它是比进程更小的能独立运行的基本单位。 一个进程可以创建和撤销多个线程,同一个进程中多个线程之间可以并发执行。
Goroutine(协程): (1)协程是一种轻量级的实现,可以在单个进程里执行成千上万的并发任务。 (2)内核态,线程跑多个协程,栈是KB级别的。 (3)协程具有独立的栈空间,并且协程的调度是由用户来控制的。
用法:go关键字放在方法调用前。
func A() {
for i := 0; i < 5; i++ {
fmt.Println("A():", i)
time.Sleep(time.Second)
}
}
func main() {
// 开启了一个协程
go test()
for i := 0; i < 5; i++ {
fmt.Println("main()", i)
time.Sleep(time.Second)
}
}
func hello(i int){
fmt.Println("hello goroutine:" +fmt.Sprint(i))
}
func HelloGoRoutine(){
for i := 0; i < 5; i++{
go func(j int){
hello(j)
}(i)
}
time.Sleep(time.Second)
}
并发模型CSP。将两个并发执行的实体通过管道相连,所有的数据通过管道传输。 协程之间的通信:提倡通过通信共享内存而不是通过共享内存而实现通信。
Channel:
- 是Go语言提供的goroutine间的通信方式。
- 可以通过channel在两个或多个goroutine之间传递信息。
- 管道有无缓冲管道与缓冲罐道。
- channel中只能存放指定的数据类型。
- channel中存放的数据个数不能超过通道容量。
- channel中数据饱和后,将数据取出就可以存入新的数据。
- 当channel关闭之后,不能再向channel写数据,但是仍然可以从channel读取数据。
当多个线程操作同一个变量时,为了保证并发安全,可以使用Lock。
var(
x int64
lock sync.Mutex
)
func test(){
...
lock.Lock()
x += 1
lock.Unlock()
...
}
对并发操作上锁,从而保证并发安全。