多线程程序在单核上运行,就是并发
多线程程序在多核上运行,不是并行
Go协程和Go主线程
Go主线程(线程):一个Go线程上,可以起多个协程 ,你可以这样理解,协程是轻量级的线程
Go协程的特点:
1)有独立的栈空间
2)共享程序堆空间
3) 调度由用户控制
4)协程是轻量级的线程3
goroutine快速入门
func test() { for i := 1; i <= 10; i++ { fmt.Println("test() hello, world " + strconv.Itoa(i)) time.Sleep(time.Second) } } func main() { go test() for i := 1; i <= 10; i++ { fmt.Println("main() hello, world " + strconv.Itoa(i)) time.Sleep(time.Second) } }
小结:
1)主线程是一个物理线程,直接作用在cpu上的,是重量级的,非常耗费cpu资源;
2)协程从主线程开启的,是轻量级的线程,是逻辑态。对资源消耗相对小;
3)Golang的协程机制是重要的特点,可以轻松的开启上万个协程。其它编程语言的并发机制是一般基于线程的,开启过多的线程,资源耗费大,这里就突显Golang在并发上的优势了。
MPG模式基本介绍
1)M:操作系统的主线程(是物理线程)
2)P:协程执行需要的上下文
3)G:协程
设置运行的cpu数目:
func main() { cupNum := runtime.NumCPU() fmt.Println(cupNum) // 设置运行的cpu数目 runtime.GOMAXPROCS(cupNum) }
原文:https://www.cnblogs.com/xiangxiaolin/p/12258022.html