溫馨提示×

CentOS Golang并發編程指南

小樊
39
2025-08-12 14:39:20
欄目: 編程語言

一、環境準備

  1. 安裝Golang

    • 通過yum安裝:sudo yum install golang
    • 或手動下載安裝包(如go1.20.4.linux-amd64.tar.gz),解壓至/usr/local,并配置環境變量:
      echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.bashrc
      source ~/.bashrc
      
    • 驗證安裝:go version。
  2. 創建項目目錄

    mkdir ~/go-concurrency-demo
    cd ~/go-concurrency-demo
    go mod init demo
    

二、基礎并發編程

  1. Goroutine(輕量級線程)

    • 使用go關鍵字啟動并發任務:
      func say(msg string) {
          for i := 0; i < 3; i++ {
              fmt.Println(msg)
          }
      }
      func main() {
          go say("Hello") // 啟動goroutine
          say("World")    // 主線程執行
      }
      
  2. Channel(通道)

    • 用于goroutine間通信:
      func worker(id int, ch chan int) {
          for num := range ch {
              fmt.Printf("Worker %d received: %d\n", id, num)
          }
      }
      func main() {
          ch := make(chan int)
          for i := 1; i <= 3; i++ {
              go worker(i, ch)
          }
          for i := 1; i <= 5; i++ {
              ch <- i // 發送數據到通道
          }
          close(ch) // 關閉通道
      }
      
  3. 同步機制

    • WaitGroup:等待一組goroutine完成
      var wg sync.WaitGroup
      wg.Add(2)
      go func() {
          defer wg.Done()
          // 任務1
      }()
      go func() {
          defer wg.Done()
          // 任務2
      }()
      wg.Wait() // 阻塞直到所有goroutine完成
      
    • Mutex:保護共享資源
      var mu sync.Mutex
      var counter int
      func increment() {
          mu.Lock()
          counter++
          mu.Unlock()
      }
      

三、進階并發模式

  1. 生產者-消費者模式

    func producer(ch chan int) {
        for i := 1; i <= 5; i++ {
            ch <- i
        }
        close(ch)
    }
    func consumer(ch chan int) {
        for num := range ch {
            fmt.Println("Consumed:", num)
        }
    }
    func main() {
        ch := make(chan int)
        go producer(ch)
        go consumer(ch)
    }
    
  2. 扇出/扇入模式

    • 扇出:多個goroutine并行處理任務;扇入:合并結果。
      func process(input int, ch chan int) {
          ch <- input * 2
      }
      func main() {
          inputs := []int{1, 2, 3, 4}
          ch := make(chan int)
          // 扇出:啟動多個goroutine處理
          for _, v := range inputs {
              go process(v, ch)
          }
          // 扇入:合并結果
          for i := 0; i < len(inputs); i++ {
              fmt.Println(<-ch)
          }
      }
      

四、調試與優化

  1. 檢測數據競爭

    go run -race main.go
    
  2. 性能分析

    • 啟用pprof:
      import _ "net/http/pprof"
      // 在代碼中啟動HTTP服務
      go func() {
          log.Println(http.ListenAndServe("localhost:6060", nil))
      }()
      
    • 使用go tool pprof分析:
      go tool pprof http://localhost:6060/debug/pprof/profile
      

五、注意事項

  • 避免過度創建goroutine:通過sync.WaitGroup或goroutine池控制并發數量。
  • 合理使用通道:無緩沖通道用于同步,有緩沖通道用于異步。
  • 上下文管理:使用context.Context傳遞取消信號或超時控制。

參考資料:

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女