Go 언어의 고루틴은 다음과 같은 방법으로 관리할 수 있습니다. 1. 고루틴 생성: "go" 키워드를 사용합니다. 2. 고루틴이 종료될 때까지 기다립니다. WaitGroup을 사용하세요. 3. 고루틴 취소: context.Context 및 context.WithCancel을 사용하세요. 스케줄링 측면에서 Go는 선점형 스케줄링 알고리즘을 사용하지만, 런타임.Gosched() 함수를 사용하면 협력 스케줄링을 트리거할 수 있습니다.
고루틴은 코루틴과 유사한 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.Context
和 context.WithCancel
函数取消 goroutine 的执行,如下所示:
ctx, cancel := context.WithCancel(context.Background()) go func() { // Goroutine 代码 select { case <-ctx.Done(): return } } // 取消 goroutine cancel()
Go 语言中内置的调度器负责管理和调度 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
유형은 아래와 같이 모든 고루틴이 종료될 때까지 기다립니다.
context.Context
및 사용 context.WithCancel
이 함수는 아래와 같이 고루틴 실행을 취소합니다. 🎜rrreee🎜Goroutine Scheduling🎜🎜Go 언어에 내장된 스케줄러는 고루틴을 관리하고 예약하는 역할을 합니다. 고루틴 시작 시기를 결정하기 위해 다음 알고리즘을 사용합니다: 🎜🎜🎜🎜선점형 스케줄링: 🎜스케줄러는 실행 중인 고루틴을 중단하고 실행을 위해 다른 고루틴으로 전환할 수 있습니다. 🎜🎜협업 스케줄링: 🎜고루틴은 적극적으로 제어권을 포기하고 이를 스케줄러에 넘겨 다른 고루틴을 스케줄합니다. 🎜기본적으로 Go 언어는 선점형 스케줄링 알고리즘을 사용하지만 일부 시나리오에서는 협업 스케줄링이 더 적합합니다. 협력 스케줄링은 runtime.Gosched()
함수를 사용하여 트리거될 수 있습니다. 🎜🎜실용 사례🎜🎜다음은 고루틴을 사용하여 작업을 동시에 처리하는 예입니다. 🎜rrreee위 내용은 Go 동시 프로그래밍에서 고루틴 관리 및 스케줄링의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!