Goroutines

2 min

go的协程

1. 概念辨析

1.1 进程/线程/协程

  • Goroutine是Go语言中的一种轻量级线程(就是协程),由Go运行时管理。

    • 线程调度是在内核态

    • 协程调度是用户态

      所以goroutine比java线程调度开销更小

    • 与操作系统级别的线程相比,goroutine的创建和销毁成本非常低,调度效率高,可以在同一个OS线程上多路复用多个goroutine,从而实现高并发。

    image-20240603192647543

    • 相比于进程间通信,go的协程间通信有自己独有的方法 ^1

1.2 goroutine的特点

  1. 轻量级:Goroutine使用非常少的内存和资源,初始栈大小仅为几KB,且会根据需要动态增长。

  2. 由Go运行时调度:Go运行时负责goroutine的调度,这种调度方式被称为GMP模型(Goroutine、OS线程、调度器)。

  3. 易于创建:创建一个goroutine非常简单,只需要在函数调用前加上go关键字。

    go func() {
        fmt.Println("Hello from Goroutine")
    }()

2. go协程间通信方式

2.2.1 Channel(通道)

2.2.2 WaitGroup(等待组)

2.2.3 Mutex(互斥锁)和 Cond(条件变量)

2.2.4 Atomic Operations(原子操作)

参考资料