首頁  >  文章  >  後端開發  >  Go並發程式設計中goroutine的管理與調度

Go並發程式設計中goroutine的管理與調度

PHPz
PHPz原創
2024-06-04 16:42:00891瀏覽

Go 語言中的 Goroutine 可透過以下方式管理:1. 建立 Goroutine:使用 "go" 關鍵字。 2. 等待 Goroutine 退出:使用 WaitGroup。 3. 取消 Goroutine:使用 context.Context 和 context.WithCancel。調度方面,Go 採用搶佔式調度演算法,但可使用 runtime.Gosched() 函數觸發協作式調度。

Go並發程式設計中goroutine的管理與調度

Go 並發程式設計中 Goroutine 的管理與調度

Goroutine 是 Go 語言中輕量級的並發執行單元,它與協程相似。為了有效管理和調度 goroutine,從而提升並發程式的效能和穩定性,Go 語言提供了豐富的 API。

Goroutine 生命週期管理

  • 建立goroutine:使用go 關鍵字建立goroutine,如下所示:

    go func() {
    // Goroutine 代码
    }
  • 等待goroutine 退出:使用WaitGroup 類型等待所有goroutine 退出,如下所示:

    var wg sync.WaitGroup
    wg.Add(numOfWorkers)
    
    for i := 0; i < numOfWorkers; i++ {
    go func(i int) {
      // Goroutine 代码
      wg.Done()
    }(i)
    }
    
    wg.Wait()
  • 取消goroutine:使用context.Contextcontext.WithCancel 函數取消goroutine 的執行,如下所示:

    ctx, cancel := context.WithCancel(context.Background())
    
    go func() {
    // Goroutine 代码
    select {
    case <-ctx.Done():
      return
    }
    }
    
    // 取消 goroutine
    cancel()

Goroutine 調度

Go 語言中內建的調度器負責管理和調度goroutine。它透過以下演算法來決定何時啟動 goroutine:

  • 搶佔式調度:調度器可以打斷正在運行的 goroutine,切換到另一個 goroutine 執行。
  • 協作式調度:goroutine 主動讓出控制權,交給調度器調度其他 goroutine。

預設情況下,Go 語言使用搶佔式調度演算法,但對於某些場景,協作式調度更合適。可以使用 runtime.Gosched() 函數觸發協作式調度。

實戰案例

以下是使用 goroutine 並發處理任務的範例:

package main

import "fmt"
import "sync"

func main() {
  // 创建 goroutine 池
  pool := make(chan func())

  // 启动 goroutine 池中的 worker
  for i := 0; i < 10; i++ {
    go func() {
      for {
        // 从池中获取任务
        task := <-pool

        // 执行任务
        task()
      }
    }()
  }

  // 发送任务到池中
  for i := 0; i < 100; i++ {
    pool <- func() {
      fmt.Println("Task", i)
    }
  }

  // 等待任务完成
  var wg sync.WaitGroup
  wg.Add(100)
  for i := 0; i < 100; i++ {
    go func() {
      defer wg.Done()
      <-pool
    }()
  }
  wg.Wait()

  // 关闭池
  close(pool)
}

以上是Go並發程式設計中goroutine的管理與調度的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn