线程和进程
1)进程就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位
2)线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位
3)一个进程可以创建和销毁多个进程,同一个进程中的多个线程可以并发执行
4)一个程序至少有一个进程,一个进程至少有一个线程
并发和并行
多线程程序在单核上运行,就是并发
多线程程序在多核上运行,就是并行
Go协程和主线程
1)Go主线程(有程序员直接称为线程/也可以理解为进程):一个Go线程上,可以起多个协程,可以理解为,协程是轻量级的线程
2)Go协程的特点
- 有独立的栈空间
- 共享程序堆空间
- 调度由用户控制
- 协程是轻量级的线程
1)如果主线程退出了,则协程即使还没有执行完毕,也会退出
2)当然协程也可以在主线程没有退出前,就自己结束,比如完成了自己的任务
package main
import (
"fmt"
"strconv"
"time"
)
//在主线程(可以将理解为进程)中,开启一个goroutine,该协程每隔一秒输出 “hello,world”
//在主线程中也每隔一秒输出“hello,golang”,输出10次后,退出程序
//要求主线程和goroutine同时执行
//编写一个函数,每隔一秒输出“hello,world ”
func test() {
for i := 0; i < 10; i++ {
fmt.Println("hello,world" + strconv.Itoa(i))
time.Sleep(time.Second)
}
}
func main() {
go test() //开启一个协程
for i := 0; i < 10; i++ {
fmt.Println("main() hello,golang" + strconv.Itoa(i))
time.Sleep(time.Second)
}
}
MPG模式基本介绍
1)M:操作系统的主线程
2)P:协程执行需要的上下文
3)G:协程
设置golang运行cpu数
go1.8后,默认让程序运行在多个核上,可以不用设置了
go1.8前,还是要设置一下
package main
import (
"fmt"
"runtime"
)
func main() {
cpuNum := runtime.NumCPU()
fmt.Println("cpuNum=", cpuNum)
//可以自己设置使用多个cpu
gomaxprocs := runtime.GOMAXPROCS(cpuNum)
fmt.Println(gomaxprocs)
}