>  기사  >  백엔드 개발  >  Go 동시 프로그래밍에서 고루틴 관리 및 스케줄링

Go 동시 프로그래밍에서 고루틴 관리 및 스케줄링

PHPz
PHPz원래의
2024-06-04 16:42:00830검색

Go 언어의 고루틴은 다음과 같은 방법으로 관리할 수 있습니다. 1. 고루틴 생성: "go" 키워드를 사용합니다. 2. 고루틴이 종료될 때까지 기다립니다. WaitGroup을 사용하세요. 3. 고루틴 취소: context.Context 및 context.WithCancel을 사용하세요. 스케줄링 측면에서 Go는 선점형 스케줄링 알고리즘을 사용하지만, 런타임.Gosched() 함수를 사용하면 협력 스케줄링을 트리거할 수 있습니다.

Go 동시 프로그래밍에서 고루틴 관리 및 스케줄링

Go 동시 프로그래밍의 고루틴 관리 및 예약

고루틴은 코루틴과 유사한 Go 언어의 경량 동시 실행 단위입니다. 고루틴을 효과적으로 관리하고 예약하여 동시 프로그램의 성능과 안정성을 향상시키기 위해 Go 언어는 풍부한 API를 제공합니다.

고루틴 수명 주기 관리

  • 고루틴 생성: 아래와 같이 go 키워드를 사용하여 고루틴을 생성합니다. 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)
}

고루틴이 종료될 때까지 기다립니다:

사용 WaitGroup 유형은 아래와 같이 모든 고루틴이 종료될 때까지 기다립니다.

rrreee🎜🎜🎜고루틴 취소: 🎜context.Context 사용 context.WithCancel 이 함수는 아래와 같이 고루틴 실행을 취소합니다. 🎜rrreee🎜Goroutine Scheduling🎜🎜Go 언어에 내장된 스케줄러는 고루틴을 관리하고 예약하는 역할을 합니다. 고루틴 시작 시기를 결정하기 위해 다음 알고리즘을 사용합니다: 🎜🎜🎜🎜선점형 스케줄링: 🎜스케줄러는 실행 중인 고루틴을 중단하고 실행을 위해 다른 고루틴으로 전환할 수 있습니다. 🎜🎜협업 스케줄링: 🎜고루틴은 적극적으로 제어권을 포기하고 이를 스케줄러에 넘겨 다른 고루틴을 스케줄합니다. 🎜기본적으로 Go 언어는 선점형 스케줄링 알고리즘을 사용하지만 일부 시나리오에서는 협업 스케줄링이 더 적합합니다. 협력 스케줄링은 runtime.Gosched() 함수를 사용하여 트리거될 수 있습니다. 🎜🎜실용 사례🎜🎜다음은 고루틴을 사용하여 작업을 동시에 처리하는 예입니다. 🎜rrreee

위 내용은 Go 동시 프로그래밍에서 고루틴 관리 및 스케줄링의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.