控制 Go 協程的生命週期可以透過以下方式:建立協程:使用 go 關鍵字啟動新任務。終止協程:等待所有協程完成,使用 sync.WaitGroup。使用通道關閉訊號。使用上下文 context.Context。
Go 語言中,協程(又稱 Goroutine)是輕量的並發執行體,用於執行特定的任務,而不會阻塞主執行緒。管理協程的生命週期對於編寫健全和可維護的平行程式碼至關重要。
使用 go
關鍵字建立協程。它在後台啟動一個新的任務,使主執行緒可以繼續執行。
go func() { // 执行任务 }
無法直接終止協程,但有以下方法可以間接達到此目的:
使用sync.WaitGroup
同步任務完成:
import "sync" var wg sync.WaitGroup func main() { for i := 0; i < 5; i++ { wg.Add(1) go func(i int) { // 执行任务 wg.Done() }(i) } wg.Wait() }
使用通道向協程發送"關閉"訊號:##
func main() { done := make(chan struct{}) for i := 0; i < 5; i++ { go func(i int) { for { select { case <-done: return // 协程停止 default: // 执行任务 } } }(i) } close(done) // 向所有协程发送"关闭"信号 }
context.Context 管理協程的執行,當上下文被取消時,協程也會終止:
import "context" func main() { ctx, cancel := context.WithCancel(context.Background()) for i := 0; i < 5; i++ { go func(i int) { for { select { case <-ctx.Done(): return // 协程停止 default: // 执行任务 } } }(i) } cancel() // 取消上下文 }
package main import "fmt" import "time" func main() { // 使用信道告诉协程何时退出 stop := make(chan struct{}) // 创建 5 个协程 for i := 0; i < 5; i++ { go func(i int) { for { // 检查是否已经收到退出信号 select { case <-stop: fmt.Printf("协程 %d 已退出\n", i) return default: fmt.Printf("协程 %d 正在运行\n", i) time.Sleep(time.Second) } } }(i) } // 运行 5 秒,然后发送退出信号 time.Sleep(time.Second * 5) close(stop) // 等待所有协程退出 time.Sleep(time.Second * 1) }
以上是如何控制 Golang 協程的生命週期?的詳細內容。更多資訊請關注PHP中文網其他相關文章!