并发任务单元
go func(s string) {println(s)
}("hello")
- go 语句创建并发任务单元(goroutine),并打包函数执行所需参数。
- 并发任务稍后由调度器调度执行。
- 进程内所有用户代码均以 goroutine 方式执行。
- 创建 goroutine 后,不阻塞。
- 任务单元自带栈内存(2KB-1GB)。
Go 语言写并发非常容易,因为所有的用户代码都是放在并发里执行的,包括 main 入口函数所有的函数都处在并发单元上执行。并发任务单元称之为 goroutine。
执行流程
当我们执行 Go 指令的时候,实际上它会创建一个并发任务,函数名字或者指针加上参数打包创建一个新的 goroutine,放到本地队列,然后 main goroutine 不会等待 goroutine 什么时候执行,main goroutine 会继续执行后面的逻辑。
什么时候执行 goroutine 是调度器调度的与当前的 main 函数无关。因为当前有很多并发线,本地队列还会与全局队列进行交互。正常情况下,并发线从自己的本地队列查找准备运行的 goroutine,如果本地队列没有,则到全局队列查找。每个本地队列大小有 256 个限制,如果多就会把一半转移给全局队列给其他的并发线使用。
如果其它并发线本地队列没有