Go 函數控制 Goroutine 執行有以下方法:runtime.Goexit():強制終止目前 Goroutine。 sync.WaitGroup: 等待一組 Goroutines 完成。 select{}:允許 Goroutine 等待多個事件之一併根據第一個觸發的事件執行相應操作。 context.Context: 可以用來向 Goroutine 傳遞截止日期或取消請求。
Go 函數如何控制Goroutine 的執行
Go 程式語言支援並發,並使用Goroutine(輕量級執行緒)實現並行. Goroutine 可以透過函數創建,並在創建後的任何時間啟動。本文將介紹用於控制 Goroutine 執行的不同函數,並提供一些實戰案例。
控制 Goroutine 執行的函數
實戰案例
1. 終止Goroutine
package main import ( "fmt" "runtime" "time" ) func main() { go func() { for { fmt.Println("Goroutine is running...") time.Sleep(1 * time.Second) } }() // 等待 10 秒后终止 Goroutine time.Sleep(10 * time.Second) runtime.Goexit() }
2. 使用sync.WaitGroup 等待Goroutine
package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup // 创建 5 个 Goroutine for i := 0; i < 5; i++ { wg.Add(1) go func(i int) { fmt.Printf("Goroutine %d is running...\n", i) time.Sleep(1 * time.Second) wg.Done() }(i) } // 等待所有 Goroutine 完成 wg.Wait() }
3. 使用select{} 回應事件
package main import ( "fmt" "time" ) func main() { fmt.Println("Waiting for events...") // 创建两个 channel ch1 := make(chan string) ch2 := make(chan string) // 创建两个 Goroutine 向 channel 发送数据 go func() { time.Sleep(1 * time.Second) ch1 <- "Event from Channel 1" }() go func() { time.Sleep(2 * time.Second) ch2 <- "Event from Channel 2" }() for { select { case msg := <-ch1: fmt.Println(msg) return case msg := <-ch2: fmt.Println(msg) return } } }
4. 使用context.Context 取消Goroutine
package main import ( "context" "fmt" "time" ) func main() { // 创建一个 context ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() // 创建一个 Goroutine go func() { for { select { case <-ctx.Done(): fmt.Println("Goroutine cancelled") return default: fmt.Println("Goroutine is running...") time.Sleep(1 * time.Second) } } }() // 等待 15 秒后取消 Goroutine time.Sleep(15 * time.Second) cancel() }
以上是golang函數如何控制goroutine的執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!