Go 語言中的 Goroutine 可透過以下方式管理:1. 建立 Goroutine:使用 "go" 關鍵字。 2. 等待 Goroutine 退出:使用 WaitGroup。 3. 取消 Goroutine:使用 context.Context 和 context.WithCancel。調度方面,Go 採用搶佔式調度演算法,但可使用 runtime.Gosched() 函數觸發協作式調度。
Goroutine 是 Go 語言中輕量級的並發執行單元,它與協程相似。為了有效管理和調度 goroutine,從而提升並發程式的效能和穩定性,Go 語言提供了豐富的 API。
建立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.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()
函數觸發協作式調度。
以下是使用 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中文網其他相關文章!