实例

Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。

goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
func say(m int) {
    for {
        fmt.Printf("Hello from goroutine %d\n", m)
    }
}
func main() {
    for i := 0; i < 5; i++ {
        go say(i)
    }
    time.Sleep(time.Millisecond)
}

换一种匿名函数写法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
func main() {
    for i := 0; i < 5; i++ {
        go func (m int) {
            for {
                fmt.Printf("Hello from goroutine %d\n", m)
            }
        }(i)
    }
    time.Sleep(time.Millisecond)
}
  • 任何函数只需加上 go 就能送给调度器运行
  • 不需要在定义时区分是否是异步函数
  • 调度器在合适的点进行切换
  • 使用 -race 如:go run -race goroutine.go 来检测数据访问冲突

goroutine 可能切换的点

  • I/O, select
  • channel
  • runtime.Goshed()
  • 函数调用(有时)
  • 等待锁

Python 中协程

  • 使用 yield 关键字实现协程
  • Python 3.5 加入了 async def 对协程原生支持