go语言控制goroutine协程退出的2种方法总结
在Go语言中,控制goroutine的退出可以通过以下两种方法实现:
- 使用
context
包中的context.Context
对象来控制多个goroutine的退出。 - 使用
sync.WaitGroup
来等待所有goroutine完成后再退出。
下面是两种方法的示例代码:
使用context
控制退出:
package main
import (
"context"
"fmt"
"time"
)
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("Goroutine is exiting...")
return
default:
// 正常的工作代码
fmt.Println("Goroutine is working...")
time.Sleep(1 * time.Second)
}
}
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
go worker(ctx)
time.Sleep(10 * time.Second) // 主goroutine休眠,以模拟程序运行
}
使用sync.WaitGroup
控制退出:
package main
import (
"fmt"
"sync"
"time"
)
func worker(wg *sync.WaitGroup) {
defer wg.Done() // 确保goroutine退出后将计数器减一
for {
// 正常的工作代码
fmt.Println("Goroutine is working...")
if endWork {
fmt.Println("End of work condition reached. Exiting...")
return
}
time.Sleep(1 * time.Second)
}
}
var endWork bool
var wg sync.WaitGroup
func main() {
wg.Add(1)
go worker(&wg)
// 假设在这里有一些逻辑来决定何时退出
time.Sleep(10 * time.Second) // 主goroutine休眠,以模拟程序运行
endWork = true
wg.Wait() // 等待所有goroutine完成
}
这两种方法都可以用来控制goroutine的退出,但是context
方式更加灵活,可以通过WithCancel、WithDeadline、WithTimeout等函数创建可以被取消的上下文,而sync.WaitGroup
方式则需要手动控制退出条件。
评论已关闭