并发编程

Go 教程 · 第 7 章 · 7 次浏览

goroutine 和 channel 是 Go 并发的核心。goroutine 是轻量线程(go 关键字启动),channel 是 goroutine 之间通信的管道("不要通过共享内存通信,要通过通信共享内存")。

goroutine

go 函数() 就启动一个并发任务,成千上万个没问题。

channel

ch := make(chan int) 创建;ch <- x 发送;x := <-ch 接收。默认无缓冲(发送和接收要同时就绪),可带缓冲 make(chan int, 10)。

select

select 同时等待多个 channel,谁有数据处理谁,实现超时、多路复用。

代码示例

package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Printf("任务 %d 开始\n", id)
    time.Sleep(time.Millisecond * 300)
    fmt.Printf("任务 %d 完成\n", id)
}

func main() {
    // WaitGroup 等待所有 goroutine
    var wg sync.WaitGroup
    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }
    wg.Wait()
    fmt.Println("全部完成")

    // channel 通信
    ch := make(chan string)
    go func() {
        ch <- "来自子 goroutine 的消息"
    }()
    msg := <-ch
    fmt.Println(msg)
}