引子:
线程比如打开腾讯视频然后开始下载多个视频,下载任务就是线程
但是这并不是同时进行的,只是时间片比较短切换的比较快
进程和线程的关系
有些程序可以多进程有些可能不支持
并发和并行
并发和并行的根本区别是:并发在同一时间段内一起执行,而并行强调同一时刻开始执行
go协程和主线程(协程的特点)
代码及输出效果:
package main
import (
"fmt"
"strconv"
"time"
)
func text() {
for i:=1;i<=10;i++{
fmt.Println("hello world"+strconv.Itoa(i))
time.Sleep(time.Second)
}
}
func main(){
go text()
for i:=1;i<=10;i++{
fmt.Println("hello golang"+strconv.Itoa(i))
time.Sleep(time.Second)
}
}
//结果
//hello world1
//hello golang1
//hello golang2
//hello world2
//hello world3
//hello golang3
//hello golang4
//hello world4
//hello world5
//hello golang5
//hello world6
//hello golang6
//hello golang7
//hello world7
//hello world8
//hello golang8
//hello golang9
//hello world9
//hello world10
//hello golang10
小结
1)主线程是一个物理线程,直接作用在CPU上的。是重量级的,非常耗费CPU资源。
2)协程从主线程开启的,是轻量级的线程,是逻辑态。对资源消耗相对小。
3)Golang的协程机制是重要的特点,可以轻松的开启上万个协程。其他编程语言的并发机制是一般基于现成的,开启3了过多的线程,资源耗费大,这里就很突显Golang在并发上的优势了。
goroutine的调度模型MPG模式基本介绍
1)M: 操作系统的主线程(是物理线程)比较耗费资源
2)P:协程执行需要的上下文
3)G:协程
相对静态的一种模式
相对动态的一种模式(在协程阻塞的情况下会怎么处理)
设置Golang运行的cpu数
充分利用多CPU的优势,在Golang程序中,设置运行的cpu数目
runtime包
里面有两个比较重要的函数:
1)获取当前系统CPU的数量
num := runtime.NumCPU()
2)设置num-1的cpu运行go程序
runtime.GOMAXPROCS(num)