Golang之goroutine
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang之goroutine相关的知识,希望对你有一定的参考价值。
参考技术A阅读前提:基本了解进程与线程定义与区别
我们知道 程序的运行顺序是根据指令语句的顺序来执行的 当我这样执行时
假设这两个函数没有调用其他函数 只是简单的输出 (fun1输出1-5 fun2输出6-10) 那么程序执行时先执行fun1函数 执行完毕后再执行fun2函数 这是毋庸置疑的
但是当我们通过创建协程来实现这两个函数时
此时 终端输出并不是输出1-10的顺序序列 而是这两个协程在同一个时间片内共同运行 简称 并行
!这里我用了time包中的Sleep 因为我这里的输出数太少 所以它一开始输出的时候还是顺序执行 体现不出来协程的特点
golang之goroutine和channel
多线程程序在单核上运行,就是并发
多线程程序在多核上运行,不是并行
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) }
以上是关于Golang之goroutine的主要内容,如果未能解决你的问题,请参考以下文章
Golang 基础:原生并发 goroutine channel 和 select 常见使用场景