首页  >  文章  >  后端开发  >  Go并发编程中goroutine的管理与调度

Go并发编程中goroutine的管理与调度

PHPz
PHPz原创
2024-06-04 16:42:00831浏览

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