ホームページ  >  記事  >  バックエンド開発  >  Go 同時プログラミングでのゴルーチンの管理とスケジュール設定

Go 同時プログラミングでのゴルーチンの管理とスケジュール設定

PHPz
PHPzオリジナル
2024-06-04 16:42:00832ブラウズ

Go 言語の Goroutine は次の方法で管理できます: 1. Goroutine を作成します: 「go」キーワードを使用します。 2. Goroutine が終了するのを待ちます。WaitGroup を使用します。 3. Goroutine をキャンセルします。context.Context と context.WithCancel を使用します。スケジューリングに関しては、Go はプリエンプティブ スケジューリング アルゴリズムを使用しますが、 runtime.Gosched() 関数を使用して協調スケジューリングをトリガーできます。

Go 同時プログラミングでのゴルーチンの管理とスケジュール設定

Go 同時プログラミングにおける Goroutine の管理とスケジューリング

Goroutine は、Go 言語の軽量の同時実行ユニットであり、コルーチンに似ています。ゴルーチンを効果的に管理およびスケジュールし、それによって並行プログラムのパフォーマンスと安定性を向上させるために、Go 言語は豊富な API を提供します。

Goroutine ライフサイクル管理

  • Goroutine を作成する: 以下に示すように、go キーワードを使用して 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()

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)
}

goroutine が終了するまで待ちます:

Use WaitGroup タイプは、以下に示すように、すべての goroutine が終了するのを待ちます:

rrreee🎜🎜🎜 goroutine をキャンセルします: 🎜 context.Context を使用します。 context.WithCancel この関数は、以下に示すように、ゴルーチンの実行をキャンセルします: 🎜rrreee🎜ゴルーチンのスケジューリング🎜🎜 Go 言語に組み込まれたスケジューラは、ゴルーチンの管理とスケジュールを担当します。次のアルゴリズムを使用して、いつ goroutine を開始するかを決定します: 🎜🎜🎜🎜 プリエンプティブ スケジューリング: 🎜 スケジューラは、実行中の goroutine を中断し、別の goroutine に切り替えて実行できます。 🎜🎜共同スケジューリング: 🎜ゴルーチンは積極的に制御を放棄し、他のゴルーチンをスケジュールするためにスケジューラーに制御を渡します。 🎜 デフォルトでは、Go 言語はプリエンプティブ スケジューリング アルゴリズムを使用しますが、一部のシナリオでは、協調スケジューリングの方が適切です。協調スケジューリングは、runtime.Gosched() 関数を使用してトリガーできます。 🎜🎜実際的なケース🎜🎜 以下は、 goroutine を使用してタスクを並行処理する例です: 🎜rrreee

以上がGo 同時プログラミングでのゴルーチンの管理とスケジュール設定の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。