线程和进程

1)进程就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位
2)线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位
3)一个进程可以创建和销毁多个进程,同一个进程中的多个线程可以并发执行
4)一个程序至少有一个进程,一个进程至少有一个线程

并发和并行

多线程程序在单核上运行,就是并发
多线程程序在多核上运行,就是并行

Go协程和主线程

1)Go主线程(有程序员直接称为线程/也可以理解为进程):一个Go线程上,可以起多个协程,可以理解为,协程是轻量级的线程
2)Go协程的特点

  • 有独立的栈空间
  • 共享程序堆空间
  • 调度由用户控制
  • 协程是轻量级的线程

1)如果主线程退出了,则协程即使还没有执行完毕,也会退出
2)当然协程也可以在主线程没有退出前,就自己结束,比如完成了自己的任务

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. "time"
  6. )
  7. //在主线程(可以将理解为进程)中,开启一个goroutine,该协程每隔一秒输出 “hello,world”
  8. //在主线程中也每隔一秒输出“hello,golang”,输出10次后,退出程序
  9. //要求主线程和goroutine同时执行
  10. //编写一个函数,每隔一秒输出“hello,world ”
  11. func test() {
  12. for i := 0; i < 10; i++ {
  13. fmt.Println("hello,world" + strconv.Itoa(i))
  14. time.Sleep(time.Second)
  15. }
  16. }
  17. func main() {
  18. go test() //开启一个协程
  19. for i := 0; i < 10; i++ {
  20. fmt.Println("main() hello,golang" + strconv.Itoa(i))
  21. time.Sleep(time.Second)
  22. }
  23. }

image.png

MPG模式基本介绍

1)M:操作系统的主线程
2)P:协程执行需要的上下文
3)G:协程

设置golang运行cpu数

go1.8后,默认让程序运行在多个核上,可以不用设置了
go1.8前,还是要设置一下

  1. package main
  2. import (
  3. "fmt"
  4. "runtime"
  5. )
  6. func main() {
  7. cpuNum := runtime.NumCPU()
  8. fmt.Println("cpuNum=", cpuNum)
  9. //可以自己设置使用多个cpu
  10. gomaxprocs := runtime.GOMAXPROCS(cpuNum)
  11. fmt.Println(gomaxprocs)
  12. }