goroutine是Go语言并行设计的核心,有人称之为go程。 Goroutine从量级上看很像协程,它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些goroutine之间的内存共享。执行goroutine只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务。goroutine比thread更易用、更高效、更轻便。
只需在函数调⽤语句前添加 go 关键字,就可创建并发执⾏单元。开发⼈员无需了解任何执⾏细节,调度器会自动将其安排到合适的系统线程上执行。
go func() {
// 执行任务
}()
使用defer语句来注册一个函数,该函数会在goroutine退出时自动执行。
func main() {
go func() {
defer func() {
// 执行任务2
}()
// 执行任务1
}()
}
调用 runtime.Goexit() 将立即终止当前 goroutine 执⾏,调度器确保所有已注册 defer 延迟调用被执行。
特点:
- Goroutine可以与普通的函数和变量一起使用,可以在任何地方启动和调度。
- Goroutine比操作系统线程更轻量,可以被更高效地创建和销毁。
- Goroutine可以在同一个线程中并发执行,无需使用昂贵的线程切换开销。
- Goroutine之间可以通过通道(channel)进行通信和同步。
- Goroutine可以在任何时候被调度程序调度执行,因此它们的执行顺序是不确定的。
- 主goroutine退出后,其它的工作goroutine也会自动退出