go语言goroutine | 青训营

41 阅读1分钟

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 延迟调用被执行。


特点:

  1. Goroutine可以与普通的函数和变量一起使用,可以在任何地方启动和调度。
  2. Goroutine比操作系统线程更轻量,可以被更高效地创建和销毁。
  3. Goroutine可以在同一个线程中并发执行,无需使用昂贵的线程切换开销。
  4. Goroutine之间可以通过通道(channel)进行通信和同步。
  5. Goroutine可以在任何时候被调度程序调度执行,因此它们的执行顺序是不确定的。
  6. 主goroutine退出后,其它的工作goroutine也会自动退出